/*
   * shows date pager on bottom of the resultlist
   */

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

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2015 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2018 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2026 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2020 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2026 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Michael Spahn <m.spahn@metaways.de>
 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Ching En Cheng <c.cheng@metaways.de>
 * @copyright   Copyright (c) 2025 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 *
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2026 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @package     Tine
 * @subpackage  Tinebase
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 *
 * @package     Tine
 * @subpackage  Tinebase
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2024 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <a.stintzing@metaways.de>
 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
 * 
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2022 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2011-2012 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2011-2014 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Michael Spahn <m.spahn@metaways.de>
 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Michael Spahn <m.spahn@metaways.de>
 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <alex@stintzing.net>
 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Ching En Cheng <c.cheng@metaways.de>
 * @copyright   Copyright (c) 2025 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @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)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2017 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2012 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Philipp Schuele <p.schuele@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
 * Tine 2.0
 * 
 * @package     Tine
 * @subpackage  Tinebase
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2025 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/*
 * Tine 2.0
 * event combo box and store
 * 
 * @package     Calendar
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <alex@stintzing.net>
 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */

/*
export const apply = Ext.apply;
export const applyIf = Ext.applyIf;
export const id = Ext.id;
export const extend = Ext.extend;
export const override = Ext.override;
export const namespace = Ext.namespace;
export const urlEncode = Ext.urlEncode;
export const urlDecode = Ext.urlDecode;
export const urlAppend = Ext.urlAppend;
export const toArray = Ext.toArray;
export const isIterable = Ext.isIterable;
export const each = Ext.each;
export const iterate = Ext.iterate;
// export const getDom = Ext.getDom;
// export const getBody = Ext.getBody;
// export const removeNode = Ext.removeNode;
export const isEmpty = Ext.isEmpty;
export const isArray = Ext.isArray;
export const isDate = Ext.isDate;
export const isObject = Ext.isObject;
export const isPrimitive = Ext.isPrimitive;
export const isFunction = Ext.isFunction;
export const isNumber = Ext.isNumber;
export const isString = Ext.isString;
export const isBoolean = Ext.isBoolean;
export const isElement = Ext.isElement;
export const isDefined = Ext.isDefined;
export const escapeRe = Ext.escapeRe;
export const ns = Ext.ns;
*/

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2013 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2015 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2024 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2010 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @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)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* 
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Nico Hessler <tine20@nico-hessler.de>
 * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/* && user_id.id*/

/* Built-in method references for those with the same name as other `lodash` methods. */

/* Built-in method references that are verified to be native. */

/* Node.js helper references. */

/* ["default"] */

/* ["default"].create */

/* ["default"].genericFields.concat */

/* ["default"].locals */

/* ["default"].openWindow */

/* ["default"].setFromJson */

/* ["default"].warn */

/* asset import */

/* binding */

/* default */

/* default.locals */

/* fixed calendars */

/* global Ext, Tine */

/* harmony default export */

/* harmony export */

/* harmony import */

/* iPadOS pre v13 */

/* import() | Tinebase/js/dompurify */

/* import() | Tinebase/js/email-addresses */

/* import() | Tinebase/js/localized-address-format */

/* import() | Tinebase/js/marked */

/* istanbul ignore if  */

/* istanbul ignore next  */

/* module decorator */

/* require.ensure | Tinebase/js/linkify */

/*!
 * Ext JS Library 3.1.1
 * Copyright(c) 2006-2010 Ext JS, LLC
 * licensing@extjs.com
 * http://www.extjs.com/license
 */

/*#__PURE__*/

/**
         * overwritten to deal with calendars special filter approach
         *
         * @return {Ext.Panel}
         */

/**
       * Select an event.
       * 
       * @param {Tine.Calendar.Model.Event} event The event to select
       * @param {EventObject} e (optional) An event associated with the selection
       * @param {Boolean} keepExisting True to retain existing selections
       * @return {Tine.Calendar.Model.Event} The selected event
       */

/**
     * <p>Extends one class to create a subclass and optionally overrides members with the passed literal. This method
     * also adds the function "override()" to the subclass that can be used to override members of the class.</p>
     * For example, to create a subclass of Ext GridPanel:
     * <pre><code>
    MyGridPanel = Ext.extend(Ext.grid.GridPanel, {
    constructor: function(config) {
    //      Create configuration for this Grid.
    var store = new Ext.data.Store({...});
    var colModel = new Ext.grid.ColumnModel({...});
    //      Create a new config object containing our computed properties
    //      *plus* whatever was in the config parameter.
    config = Ext.apply({
        store: store,
        colModel: colModel
    }, config);
     MyGridPanel.superclass.constructor.call(this, config);
    //      Your postprocessing here
    },
    yourMethod: function() {
    // etc.
    }
    });
    </code></pre>
     *
     * <p>This function also supports a 3-argument call in which the subclass's constructor is
     * passed as an argument. In this form, the parameters are as follows:</p>
     * <div class="mdetail-params"><ul>
     * <li><code>subclass</code> : Function <div class="sub-desc">The subclass constructor.</div></li>
     * <li><code>superclass</code> : Function <div class="sub-desc">The constructor of class being extended</div></li>
     * <li><code>overrides</code> : Object <div class="sub-desc">A literal with members which are copied into the subclass's
     * prototype, and are therefore shared among all instances of the new class.</div></li>
     * </ul></div>
     *
     * @param {Function} superclass The constructor of class being extended.
     * @param {Object} overrides <p>A literal with members which are copied into the subclass's
     * prototype, and are therefore shared between all instances of the new class.</p>
     * <p>This may contain a special member named <tt><b>constructor</b></tt>. This is used
     * to define the constructor of the new class, and is returned. If this property is
     * <i>not</i> specified, a constructor is generated and returned which just calls the
     * superclass's constructor passing on its parameters.</p>
     * <p><b>It is essential that you call the superclass constructor in any provided constructor. See example code.</b></p>
     * @return {Function} The subclass constructor from the <code>overrides</code> parameter, or a generated one if not provided.
     */

/**
     * <p>Removes this element from the document, removes all DOM event listeners, and deletes the cache reference.
     * All DOM event listeners are removed from this element. If {@link Ext#enableNestedListenerRemoval} is
     * <code>true</code>, then DOM event listeners are also removed from all child nodes. The body node
     * will be ignored if passed in.</p>
     * @param {HTMLElement} node The node to remove
     */

/**
     * <p>Returns true if the passed value is empty.</p>
     * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>
     * <li>null</li>
     * <li>undefined</li>
     * <li>an empty array</li>
     * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>
     * </ul></div>
     * @param {Mixed} value The value to test
     * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false)
     * @return {Boolean}
     */

/**
     * <p>Utility method for returning a default value if the passed value is empty.</p>
     * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>
     * <li>null</li>
     * <li>undefined</li>
     * <li>an empty array</li>
     * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>
     * </ul></div>
     * @param {Mixed} value The value to test
     * @param {Mixed} defaultValue The value to return if the original value is empty
     * @param {Boolean} allowBlank (optional) true to allow zero length strings to qualify as non-empty (defaults to false)
     * @return {Mixed} value, if non-empty, else defaultValue
     */

/**
     * <p>Zips N sets together.</p>
     * <pre><code>
    // Example 1:
    Ext.zip([1,2,3],[4,5,6]); // [[1,4],[2,5],[3,6]]
    // Example 2:
    Ext.zip(
    [ "+", "-", "+"],
    [  12,  10,  22],
    [  43,  15,  96],
    function(a, b, c){
    return "$" + a + "" + b + "." + c
    }
    ); // ["$+12.43", "$-10.15", "$+22.96"]
     * </code></pre>
     * @param {Arrays|NodeLists} arr This argument may be repeated. Array(s) to contribute values.
     * @param {Function} zipper (optional) The last item in the argument list. This will drive how the items are zipped together.
     * @return {Array} The zipped set.
     */

/**
     * @event change
     * Fired whenever a viewstate changes
     * @param {Tine.Calendar.PagingToolbar} this
     * @param {String} activeView
     * @param {Array} period
     */

/**
     * @event changeview
     * fired if an event got clicked
     * @param {Tine.Calendar.MainScreenCenterPanel} mspanel
     * @param {String} view
     */

/**
     * @event dtStartChange
     * @desc  Fired when dtstart chages in UI
     * @param {Json String} oldValue, newValue
     */

/**
     * @event refresh
     * Fired when user request view freshresh
     * @param {Tine.Calendar.PagingToolbar} this
     * @param {String} activeView
     * @param {Array} period
     */

/**
     * Adds a list of functions to the prototype of an existing class, overwriting any existing methods with the same name.
     * Usage:<pre><code>
    Ext.override(MyClass, {
    newMethod1: function(){
    // etc.
    },
    newMethod2: function(foo){
    // etc.
    }
    });
    </code></pre>
     * @param {Object} origclass The class to override
     * @param {Object} overrides The list of functions to add to origClass.  This should be specified as an object literal
     * containing one or more methods.
     * @method override
     */

/**
     * After any data loads, the raw JSON data is available for further custom processing.  If no data is
     * loaded or there is a load exception this property will be undefined.
     * @type Object
     */

/**
     * Appends content to the query string of a URL, handling logic for whether to place
     * a question mark or ampersand.
     * @param {String} url The URL to append to.
     * @param {String} s The content to append to the URL.
     * @return (String) The resulting URL
     */

/**
     * Applies event listeners to elements by selectors when the document is ready.
     * The event name is specified with an <tt>&#64;</tt> suffix.
     * <pre><code>
    Ext.addBehaviors({
    // add a listener for click on all anchors in element with id foo
    '#foo a&#64;click' : function(e, t){
    // do something
    },
     // add the same listener to multiple selectors (separated by comma BEFORE the &#64;)
    '#foo a, #bar span.some-class&#64;mouseover' : function(){
    // do something
    }
    });
     * </code></pre> 
     * @param {Object} obj The list of behaviors to apply
     */

/**
     * Attempts to destroy and then remove a set of named properties of the passed object.
     * @param {Object} o The object (most likely a Component) who's properties you wish to destroy.
     * @param {Mixed} arg1 The name of the property to destroy and remove from the object.
     * @param {Mixed} etc... More property names to destroy and remove.
     */

/**
     * Attempts to destroy any objects passed to it by removing all event listeners, removing them from the
     * DOM (if applicable) and calling their destroy functions (if available).  This method is primarily
     * intended for arguments of type {@link Ext.Element} and {@link Ext.Component}, but any subclass of
     * {@link Ext.util.Observable} can be passed in.  Any number of elements and/or components can be
     * passed into this function in a single call as separate arguments.
     * @param {Mixed} arg1 An {@link Ext.Element}, {@link Ext.Component}, or an Array of either of these to destroy
     * @param {Mixed} arg2 (optional)
     * @param {Mixed} etc... (optional)
     */

/**
     * By default, Ext intelligently decides whether floating elements should be shimmed. If you are using flash,
     * you may want to set this to true.
     * @type Boolean
     */

/**
     * Calculates the mean of the Array
     * @param {Array} arr The Array to calculate the mean value of.
     * @return {Number} The mean.
     */

/**
     * Calculates the sum of the Array
     * @param {Array} arr The Array to calculate the sum value of.
     * @return {Number} The sum.
     */

/**
     * Converts any iterable (numeric indices and a length property) into a true array
     * Don't use this on strings. IE doesn't support "abc"[0] which this implementation depends on.
     * For strings, use this instead: "abc".match(/./g) => [a,b,c];
     * @param {Iterable} the iterable object to be turned into a true Array.
     * @return (Array) array
     */

/**
     * Copies a set of named properties fom the source object to the destination object.
     * <p>example:<pre><code>
    ImageComponent = Ext.extend(Ext.BoxComponent, {
    initComponent: function() {
    this.autoEl = { tag: 'img' };
    MyComponent.superclass.initComponent.apply(this, arguments);
    this.initialBox = Ext.copyTo({}, this.initialConfig, 'x,y,width,height');
    }
    });
     * </code></pre> 
     * @param {Object} The destination object.
     * @param {Object} The source object.
     * @param {Array/String} Either an Array of property names, or a comma-delimited list
     * of property names to copy.
     * @return {Object} The modified object.
    */

/**
     * Copies all the properties of config to obj if they don't already exist.
     * @param {Object} obj The receiver of the properties
     * @param {Object} config The source of the properties
     * @return {Object} returns obj
     */

/**
     * Creates a copy of the passed Array with falsy values removed.
     * @param {Array/NodeList} arr The Array from which to remove falsy values.
     * @return {Array} The new, compressed Array.
     */

/**
     * Creates a copy of the passed Array, filtered to contain only unique values.
     * @param {Array} arr The Array to filter
     * @return {Array} The new Array containing unique values.
     */

/**
     * Creates namespaces to be used for scoping variables and classes so that they are not global.
     * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
     * <pre><code>
    Ext.namespace('Company', 'Company.data');
    Ext.namespace('Company.data'); // equivalent and preferable to above syntax
    Company.Widget = function() { ... }
    Company.data.CustomStore = function(config) { ... }
    </code></pre>
     * @param {String} namespace1
     * @param {String} namespace2
     * @param {String} etc
     * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created)
     * @method namespace
     */

/**
     * EXPERIMENTAL - True to cascade listener removal to child elements when an element is removed.
     * Currently not optimized for performance.
     * @type Boolean
     */

/**
     * Escapes the passed string for use in a regular expression
     * @param {String} str
     * @return {String}
     */

/**
     * Generates unique ids. If the element already has an id, it is unchanged
     * @param {Mixed} el (optional) The element to generate an id for
     * @param {String} prefix (optional) Id prefix (defaults "ext-gen")
     * @return {String} The generated Id.
     */

/**
     * Indicates whether to use native browser parsing for JSON methods.
     * This option is ignored if the browser does not support native JSON methods.
     * <b>Note: Native JSON methods will not work with objects that have functions.
     * Also, property names must be quoted, otherwise the data will not parse.</b> (Defaults to false)
     * @type Boolean
     */

/**
     * Invokes a method on each item in an Array.
     * <pre><code>
    // Example:
    Ext.invoke(Ext.query("p"), "getAttribute", "id");
    // [el1.getAttribute("id"), el2.getAttribute("id"), ..., elN.getAttribute("id")]
     * </code></pre>
     * @param {Array|NodeList} arr The Array of items to invoke the method on.
     * @param {String} methodName The method name to invoke.
     * @param {Anything} ... Arguments to send into the method invocation.
     * @return {Array} The results of invoking the method on each item in the array.
     */

/**
     * Iterates an array calling the supplied function.
     * @param {Array/NodeList/Mixed} array The array to be iterated. If this
     * argument is not really an array, the supplied function is called once.
     * @param {Function} fn The function to be called with each item. If the
     * supplied function returns false, iteration stops and this method returns
     * the current <code>index</code>. This function is called with
     * the following arguments:
     * <div class="mdetail-params"><ul>
     * <li><code>item</code> : <i>Mixed</i>
     * <div class="sub-desc">The item at the current <code>index</code>
     * in the passed <code>array</code></div></li>
     * <li><code>index</code> : <i>Number</i>
     * <div class="sub-desc">The current index within the array</div></li>
     * <li><code>allItems</code> : <i>Array</i>
     * <div class="sub-desc">The <code>array</code> passed as the first
     * argument to <code>Ext.each</code>.</div></li>
     * </ul></div>
     * @param {Object} scope The scope (<code>this</code> reference) in which the specified function is executed.
     * Defaults to the <code>item</code> at the current <code>index</code>
     * within the passed <code>array</code>.
     * @return See description for the fn parameter.
     */

/**
     * Iterates either the elements in an array, or each of the properties in an object.
     * <b>Note</b>: If you are only iterating arrays, it is better to call {@link #each}.
     * @param {Object/Array} object The object or array to be iterated
     * @param {Function} fn The function to be called for each iteration.
     * The iteration will stop if the supplied function returns false, or
     * all array elements / object properties have been covered. The signature
     * varies depending on the type of object being interated:
     * <div class="mdetail-params"><ul>
     * <li>Arrays : <tt>(Object item, Number index, Array allItems)</tt>
     * <div class="sub-desc">
     * When iterating an array, the supplied function is called with each item.</div></li>
     * <li>Objects : <tt>(String key, Object value, Object)</tt>
     * <div class="sub-desc">
     * When iterating an object, the supplied function is called with each key-value pair in
     * the object, and the iterated object</div></li>
     * </ul></div>
     * @param {Object} scope The scope (<code>this</code> reference) in which the specified function is executed. Defaults to
     * the <code>object</code> being iterated.
     */

/**
     * Partitions the set into two sets: a true set and a false set.
     * Example: 
     * Example2: 
     * <pre><code>
    // Example 1:
    Ext.partition([true, false, true, true, false]); // [[true, true, true], [false, false]]
    // Example 2:
    Ext.partition(
    Ext.query("p"),
    function(val){
    return val.className == "class1"
    }
    );
    // true are those paragraph elements with a className of "class1",
    // false set are those that do not have that className.
     * </code></pre>
     * @param {Array|NodeList} arr The array to partition
     * @param {Function} truth (optional) a function to determine truth.  If this is omitted the element
     *                   itself must be able to be evaluated for its truthfulness.
     * @return {Array} [true<Array>,false<Array>]
     */

/**
     * Plucks the value of a property from each item in the Array
     * <pre><code>
    // Example:
    Ext.pluck(Ext.query("p"), "className"); // [el1.className, el2.className, ..., elN.className]
     * </code></pre>
     * @param {Array|NodeList} arr The Array of items to pluck the value from.
     * @param {String} prop The property name to pluck from each element.
     * @return {Array} The value from each item in the Array.
     */

/**
     * Recursively flattens into 1-d Array. Injects Arrays inline.
     * @param {Array} arr The array to flatten
     * @return {Array} The new, flattened array.
     */

/**
     * Removes a DOM node from the document.
     */

/**
     * Return the dom node for the passed String (id), dom node, or Ext.Element.
     * Optional 'strict' flag is needed for IE since it can return 'name' and
     * 'id' elements by using getElementById.
     * Here are some examples:
     * <pre><code>
    // gets dom node based on id
    var elDom = Ext.getDom('elId');
    // gets dom node based on the dom node
    var elDom1 = Ext.getDom(elDom);
    // If we don&#39;t know if we are working with an
    // Ext.Element or a dom node use Ext.getDom
    function(el){
    var dom = Ext.getDom(el);
    // do something with the dom node
    }
     * </code></pre>
     * <b>Note</b>: the dom node to be found actually needs to exist (be rendered, etc)
     * when this method is called to be successful.
     * @param {Mixed} el
     * @return HTMLElement
     */

/**
     * Returns the current HTML document object as an {@link Ext.Element}.
     * @return Ext.Element The document
     */

/**
     * Returns the current document body as an {@link Ext.Element}.
     * @return Ext.Element The document body
     */

/**
     * Returns the maximum value in the Array
     * @param {Array|NodeList} arr The Array from which to select the maximum value.
     * @param {Function} comp (optional) a function to perform the comparision which determines maximization.
     *                   If omitted the ">" operator will be used. Note: gt = 1; eq = 0; lt = -1
     * @return {Object} The maximum value in the Array.
     */

/**
     * Returns the minimum value in the Array.
     * @param {Array|NodeList} arr The Array from which to select the minimum value.
     * @param {Function} comp (optional) a function to perform the comparision which determines minimization.
     *                   If omitted the "<" operator will be used. Note: gt = 1; eq = 0; lt = -1
     * @return {Object} The minimum value in the Array.
     */

/**
     * Returns the type of object that is passed in. If the object passed in is null or undefined it
     * return false otherwise it returns one of the following values:<div class="mdetail-params"><ul>
     * <li><b>string</b>: If the object passed is a string</li>
     * <li><b>number</b>: If the object passed is a number</li>
     * <li><b>boolean</b>: If the object passed is a boolean value</li>
     * <li><b>date</b>: If the object passed is a Date object</li>
     * <li><b>function</b>: If the object passed is a function reference</li>
     * <li><b>object</b>: If the object passed is an object</li>
     * <li><b>array</b>: If the object passed is an array</li>
     * <li><b>regexp</b>: If the object passed is a regular expression</li>
     * <li><b>element</b>: If the object passed is a DOM Element</li>
     * <li><b>nodelist</b>: If the object passed is a DOM NodeList</li>
     * <li><b>textnode</b>: If the object passed is a DOM text node and contains something other than whitespace</li>
     * <li><b>whitespace</b>: If the object passed is a DOM text node and contains only whitespace</li>
     * </ul></div>
     * @param {Mixed} object
     * @return {String}
     */

/**
     * Returns true if the passed object is a JavaScript date object, otherwise false.
     * @param {Object} object The object to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a JavaScript Function, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a JavaScript Object, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a JavaScript array, otherwise false.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a boolean.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a number. Returns false for non-finite numbers.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is a string.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is an HTMLElement
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Returns true if the passed value is not undefined.
     * @param {Mixed} value The value to test
     * @return {Boolean}
     */

/**
     * Takes an encoded URL and and converts it to an object. Example: <pre><code>
    Ext.urlDecode("foo=1&bar=2"); // returns {foo: "1", bar: "2"}
    Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", false); // returns {foo: "1", bar: ["2", "3", "4"]}
    </code></pre>
     * @param {String} string
     * @param {Boolean} overwrite (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false).
     * @return {Object} A literal with members
     */

/**
     * Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2".  Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value.
     * @param {Object} o
     * @param {String} pre (optional) A prefix to add to the url encoded string
     * @return {String}
     */

/**
     * The {@link Ext.data.Store} to which this Record belongs.
     * @property store
     * @type {Ext.data.Store}
     */

/**
     * This is shorthand reference to {@link Ext.ComponentMgr#get}.
     * Looks up an existing {@link Ext.Component Component} by {@link Ext.Component#id id}
     * @param {String} id The component {@link Ext.Component#id id}
     * @return Ext.Component The Component, <tt>undefined</tt> if not found, or <tt>null</tt> if a
     * Class was found.
    */

/**
     * True if the browser is in strict (standards-compliant) mode, as opposed to quirks mode
     * @type Boolean
     */

/**
     * True if the detected browser is Chrome.
     * @type Boolean
     */

/**
     * True if the detected browser is Internet Explorer 6.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Internet Explorer 7.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Internet Explorer 8.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Internet Explorer running in non-strict mode.
     * @type Boolean
     */

/**
     * True if the detected browser is Internet Explorer.
     * @type Boolean
     */

/**
     * True if the detected browser is Opera.
     * @type Boolean
     */

/**
     * True if the detected browser is Safari 2.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Safari 3.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Safari 4.x.
     * @type Boolean
     */

/**
     * True if the detected browser is Safari.
     * @type Boolean
     */

/**
     * True if the detected browser uses WebKit.
     * @type Boolean
     */

/**
     * True if the detected browser uses a Gecko 1.9+ layout engine (e.g. Firefox 3.x).
     * @type Boolean
     */

/**
     * True if the detected browser uses a pre-Gecko 1.9 layout engine (e.g. Firefox 2.x).
     * @type Boolean
     */

/**
     * True if the detected browser uses the Gecko layout engine (e.g. Mozilla, Firefox).
     * @type Boolean
     */

/**
     * True if the detected platform is Adobe Air.
     * @type Boolean
     */

/**
     * True if the detected platform is Linux.
     * @type Boolean
     */

/**
     * True if the detected platform is Mac OS.
     * @type Boolean
     */

/**
     * True if the detected platform is Windows.
     * @type Boolean
     */

/**
     * True if the page is running over SSL
     * @type Boolean
     */

/**
     * True if the {@link Ext.Fx} Class is available
     * @type Boolean
     * @property enableFx
     */

/**
     * True to automatically purge event listeners during garbageCollection (defaults to false).
     * @type Boolean
     */

/**
     * True to automatically uncache orphaned Ext.Elements periodically (defaults to true)
     * @type Boolean
     */

/**
     * True when the document is fully initialized and ready for action
     * @type Boolean
     */

/**
     * URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images. 
     * In older versions of IE, this defaults to "http://extjs.com/s.gif" and you should change this to a URL on your server.
     * For other browsers it uses an inline data URL.
     * @type String
     */

/**
     * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent
     * the IE insecure content warning (<tt>'about:blank'</tt>, except for IE in secure mode, which is <tt>'javascript:""'</tt>).
     * @type String
     */

/**
     * Utility method for getting the width of the browser scrollbar. This can differ depending on
     * operating system settings, such as the theme or font size.
     * @param {Boolean} force (optional) true to force a recalculation of the value.
     * @return {Number} The width of the scrollbar.
     */

/**
     * Utility method for validating that a value is numeric, returning the specified default value if it is not.
     * @param {Mixed} value Should be a number, but any type will be handled appropriately
     * @param {Number} defaultValue The value to return if the original value is non-numeric
     * @return {Number} Value, if numeric, else defaultValue
     */

/**
    * A reusable empty function
    * @property
    * @type Function
    */

/**
    * MixedCollection has a generic way to fetch keys if you implement getKey.  The default implementation
    * simply returns <b><code>item.id</code></b> but you can provide your own implementation
    * to return a different value as in the following examples:<pre><code>
  // normal way
  var mc = new Ext.util.MixedCollection();
  mc.add(someEl.dom.id, someEl);
  mc.add(otherEl.dom.id, otherEl);
  //and so on
  // using getKey
  var mc = new Ext.util.MixedCollection();
  mc.getKey = function(el){
  return el.dom.id;
  };
  mc.add(someEl);
  mc.add(otherEl);
  // or via the constructor
  var mc = new Ext.util.MixedCollection(false, function(el){
  return el.dom.id;
  });
  mc.add(someEl);
  mc.add(otherEl);
   * </code></pre>
   * @param {Object} item The item for which to find the key.
   * @return {Object} The key for the passed item.
   */

/**
   *
   * @param attendee
   * @param date
   *
   * example
   * http://tine20.example.com:10443/#/Calendar/pollFBView/user/89192f9d3ce44ed3681a1b73d5ca491e766c4d62/2017-12-08
   */

/**
   *
   * @param {String} part
   */

/**
   *
   * @returns {{xtype: string, border: boolean, plain: boolean, activeTab: number, border: boolean, items: [null,null,null]}}
   */

/**
   *  @cfg {Integer} wheelIncrement
   *  the number of pixels to increment on mouse wheel scrolling (defaults to 50)
   */

/**
   * $property Object view -> startdate
   */

/**
   * <p><b>Only present if this Record was created by an {@link Ext.data.ArrayReader ArrayReader} or a {@link Ext.data.JsonReader JsonReader}</b>.</p>
   * <p>The Array or object which was the source of the data for this Record.</p>
   * @property json
   * @type {Array|Object}
   */

/**
   * <p><b>Only present if this Record was created by an {@link Ext.data.XmlReader XmlReader}</b>.</p>
   * <p>The XML element which was the source of the data for this Record.</p>
   * @property node
   * @type {XMLElement}
   */

/**
   * <p><b>This property is stored in the Record definition's <u>prototype</u></b></p>
   * A MixedCollection containing the defined {@link Ext.data.Field Field}s for this Record.  Read-only.
   * @property fields
   * @type Ext.util.MixedCollection
   */

/**
   * <p>Fires the specified event with the passed parameters (minus the event name).</p>
   * <p>An event may be set to bubble up an Observable parent hierarchy (See {@link Ext.Component#getBubbleTarget})
   * by calling {@link #enableBubble}.</p>
   * @param {String} eventName The name of the event to fire.
   * @param {Object...} args Variable number of parameters are passed to handlers.
   * @return {Boolean} returns false if any of the handlers return false otherwise it returns true.
   */

/**
   * <p>Marks this <b>Record</b> as <code>{@link #dirty}</code>.  This method
   * is used interally when adding <code>{@link #phantom}</code> records to a
   * {@link Ext.data.Store#writer writer enabled store}.</p>
   * <br><p>Marking a record <code>{@link #dirty}</code> causes the phantom to
   * be returned by {@link Ext.data.Store#getModifiedRecords} where it will
   * have a create action composed for it during {@link Ext.data.Store#save store save}
   * operations.</p>
   */

/**
   * <tt>true</tt> when the record does not yet exist in a server-side database (see
   * {@link #markDirty}).  Any record which has a real database pk set as its id property
   * is NOT a phantom -- it's real.
   * @property phantom
   * @type {Boolean}
   */

/**
   * @TODO this returns wrong cols on DST boundaries:
   *  e.g. on DST switch form +2 to +1 an all day event is 25 hrs. long
   * 
   * @param {} date
   * @return {}
   */

/**
   * @cfg String moreString
   * i18n._('{0} more...')
   */

/**
   * @cfg defaut text for new attendee combo
   * i18n._('Click here to invite another attender...')
   */

/**
   * @cfg {Array/Object} data
   */

/**
   * @cfg {Array/Object} fields
   * <p>Either an Array of {@link Ext.data.Field Field} definition objects (which
   * will be passed to {@link Ext.data.Record#create}, or a {@link Ext.data.Record Record}
   * constructor created from {@link Ext.data.Record#create}.</p>
   */

/**
   * @cfg {Array} dayNames
   * An array of textual day names which can be overriden for localization support (defaults to Date.dayNames)
   */

/**
   * @cfg {Array} monthNames
   * An array of textual month names which can be overriden for localization support (defaults to Date.monthNames)
   */

/**
   * @cfg {Boolean} addFixedCalendars
   */

/**
   * @cfg {Boolean} allowBlank
   * (Optional) Used for validating a {@link Ext.data.Record record}, defaults to <tt>true</tt>.
   * An empty value here will cause {@link Ext.data.Record}.{@link Ext.data.Record#isValid isValid}
   * to evaluate to <tt>false</tt>.
   */

/**
   * @cfg {Boolean} allowFunctions Specify <tt>true</tt> if the {@link #addAll}
   * function should add function references to the collection. Defaults to
   * <tt>false</tt>.
   */

/**
   * @cfg {Boolean} denyDragOnMissingEditGrant
   * deny drag action if edit grant for event is missing
   */

/**
   * @cfg {Boolean} initialLoadAfterRender
   */

/**
   * @cfg {Boolean} readOnly
   * no dd acionts if read only
   */

/**
   * @cfg {Boolean} showAttendeeRole
   * true to show roles in the list
   */

/**
   * @cfg {Boolean} showGroupMemberType
   * show user_type groupmember in type selection
   */

/**
   * @cfg {Boolean} showNamesOnly
   * true to only show types and names in the list
   */

/**
   * @cfg {Boolean} showReloadBtn
   */

/**
   * @cfg {Boolean} showTodayBtn
   */

/**
   * @cfg {Boolean} success
   */

/**
   * @cfg {Bool} cropDayTime
   * crop times before and after dayStart and dayEnd
   */

/**
   * @cfg {Bool} hasDetailsPanel 
   */

/**
   * @cfg {Bool} requireFreeBusyGrantOnly
   *  freebusy grant is sufficient to find ressource (instead of inviteGrant)
   */

/**
   * @cfg {Bool} requireFreeBusyGrantOnly
   * freebusy grant is sufficient to find ressource (instead of inviteGrant)
   */

/**
   * @cfg {Date} dtEnd
   * end of range for this registry 
   */

/**
   * @cfg {Date} dtStart
   * start of range for this registry
   */

/**
   * @cfg {Date} dtstart
   */

/**
   * @cfg {Date} startDate
   * start date
   */

/**
   * @cfg {Ext.data.DataProxy} recordProxy
   */

/**
   * @cfg {Ext.data.Record/Ext.data.Record[]} records related to the Request action
   */

/**
   * @cfg {Ext.data.Store} store
   */

/**
   * @cfg {Function} convert
   * (Optional) A function which converts the value provided by the Reader into an object that will be stored
   * in the Record. It is passed the following parameters:<div class="mdetail-params"><ul>
   * <li><b>v</b> : Mixed<div class="sub-desc">The data value as read by the Reader, if undefined will use
   * the configured <tt>{@link Ext.data.Field#defaultValue defaultValue}</tt>.</div></li>
   * <li><b>rec</b> : Mixed<div class="sub-desc">The data object containing the row as read by the Reader.
   * Depending on the Reader type, this could be an Array ({@link Ext.data.ArrayReader ArrayReader}), an object
   *  ({@link Ext.data.JsonReader JsonReader}), or an XML element ({@link Ext.data.XMLReader XMLReader}).</div></li>
   * </ul></div>
   * <pre><code>
  // example of convert function
  function fullName(v, record){
  return record.name.last + ', ' + record.name.first;
  }
  function location(v, record){
  return !record.city ? '' : (record.city + ', ' + record.state);
  }
  var Dude = Ext.data.Record.create([
  {name: 'fullname',  convert: fullName},
  {name: 'firstname', mapping: 'name.first'},
  {name: 'lastname',  mapping: 'name.last'},
  {name: 'city', defaultValue: 'homeless'},
  'state',
  {name: 'location',  convert: location}
  ]);
  // create the data store
  var store = new Ext.data.Store({
  reader: new Ext.data.JsonReader(
      {
          idProperty: 'key',
          root: 'daRoot',
          totalProperty: 'total'
      },
      Dude  // recordType
  )
  });
  var myData = [
  { key: 1,
    name: { first: 'Fat',    last:  'Albert' }
    // notice no city, state provided in data object
  },
  { key: 2,
    name: { first: 'Barney', last:  'Rubble' },
    city: 'Bedrock', state: 'Stoneridge'
  },
  { key: 3,
    name: { first: 'Cliff',  last:  'Claven' },
    city: 'Boston',  state: 'MA'
  }
  ];
   * </code></pre>
   */

/**
   * @cfg {Function} sortType
   * (Optional) A function which converts a Field's value to a comparable value in order to ensure
   * correct sort ordering. Predefined functions are provided in {@link Ext.data.SortTypes}. A custom
   * sort example:<pre><code>
  // current sort     after sort we want
  // +-+------+          +-+------+
  // |1|First |          |1|First |
  // |2|Last  |          |3|Second|
  // |3|Second|          |2|Last  |
  // +-+------+          +-+------+
  sortType: function(value) {
  switch (value.toLowerCase()) // native toLowerCase():
  {
    case 'first': return 1;
    case 'second': return 2;
    default: return 3;
  }
  }
   * </code></pre>
   */

/**
   * @cfg {Mixed} defaultValue
   * (Optional) The default value used <b>when a Record is being created by a {@link Ext.data.Reader Reader}</b>
   * when the item referenced by the <tt>{@link Ext.data.Field#mapping mapping}</tt> does not exist in the data
   * object (i.e. undefined). (defaults to "")
   */

/**
   * @cfg {Number} autoRefreshInterval (seconds)
   */

/**
   * @cfg {Number} granularity
   * granularity of this registry in minutes
   */

/**
   * @cfg {Number} labelWidth
   * width of left label column
   */

/**
   * @cfg {Number} numOfDays
   * number of days to display
   */

/**
   * @cfg {Number} startDay
   * Day index at which the week should begin, 0-based
   */

/**
   * @cfg {Number} timeGranularity
   * granularity of timegrid in minutes
   */

/**
   * @cfg {Number} timeIncrement
   * time increment for range adds/edits (minutes)
   */

/**
   * @cfg {Number} timeVisible
   * time visible in scrolling area (minutes)
   */

/**
   * @cfg {Object} listeners (optional) <p>A config object containing one or more event handlers to be added to this
   * object during initialization.  This should be a valid listeners config object as specified in the
   * {@link #addListener} example for attaching multiple handlers at once.</p>
   * <br><p><b><u>DOM events from ExtJs {@link Ext.Component Components}</u></b></p>
   * <br><p>While <i>some</i> ExtJs Component classes export selected DOM events (e.g. "click", "mouseover" etc), this
   * is usually only done when extra value can be added. For example the {@link Ext.DataView DataView}'s
   * <b><code>{@link Ext.DataView#click click}</code></b> event passing the node clicked on. To access DOM
   * events directly from a Component's HTMLElement, listeners must be added to the <i>{@link Ext.Component#getEl Element}</i> after the Component
   * has been rendered. A plugin can simplify this step:<pre><code>
  // Plugin is configured with a listeners config object.
  // The Component is appended to the argument list of all handler functions.
  Ext.DomObserver = Ext.extend(Object, {
  constructor: function(config) {
      this.listeners = config.listeners ? config.listeners : config;
  },
   // Component passes itself into plugin&#39;s init method
  init: function(c) {
      var p, l = this.listeners;
      for (p in l) {
          if (Ext.isFunction(l[p])) {
              l[p] = this.createHandler(l[p], c);
          } else {
              l[p].fn = this.createHandler(l[p].fn, c);
          }
      }
       // Add the listeners to the Element immediately following the render call
      c.render = c.render.{@link Function#createSequence createSequence}(function() {
          var e = c.getEl();
          if (e) {
              e.on(l);
          }
      });
  },
   createHandler: function(fn, c) {
      return function(e) {
          fn.call(this, e, c);
      };
  }
  });
  var combo = new Ext.form.ComboBox({
   // Collapse combo when its element is clicked on
  plugins: [ new Ext.DomObserver({
      click: function(evt, comp) {
          comp.collapse();
      }
  })],
  store: myStore,
  typeAhead: true,
  mode: 'local',
  triggerAction: 'all'
  });
   * </code></pre></p>
   */

/**
   * @cfg {Object} period
   * period to display
   */

/**
   * @cfg {Object} preparedPart
   * server prepared text/calendar iMIP part 
   */

/**
   * @cfg {Object} raw The raw response returned from server-code
   */

/**
   * @cfg {String/Number} mapping
   * <p>(Optional) A path expression for use by the {@link Ext.data.DataReader} implementation
   * that is creating the {@link Ext.data.Record Record} to extract the Field value from the data object.
   * If the path expression is the same as the field name, the mapping may be omitted.</p>
   * <p>The form of the mapping expression depends on the Reader being used.</p>
   * <div class="mdetail-params"><ul>
   * <li>{@link Ext.data.JsonReader}<div class="sub-desc">The mapping is a string containing the javascript
   * expression to reference the data from an element of the data item's {@link Ext.data.JsonReader#root root} Array. Defaults to the field name.</div></li>
   * <li>{@link Ext.data.XmlReader}<div class="sub-desc">The mapping is an {@link Ext.DomQuery} path to the data
   * item relative to the DOM element that represents the {@link Ext.data.XmlReader#record record}. Defaults to the field name.</div></li>
   * <li>{@link Ext.data.ArrayReader}<div class="sub-desc">The mapping is a number indicating the Array index
   * of the field's value. Defaults to the field specification's Array position.</div></li>
   * </ul></div>
   * <p>If a more complex value extraction strategy is required, then configure the Field with a {@link #convert}
   * function. This is passed the whole row object, and may interrogate it in whatever way is necessary in order to
   * return the desired data.</p>
   */

/**
   * @cfg {String} (H:i) dayEnd
   * generic end of the (work) day
   */

/**
   * @cfg {String} (H:i) dayStart
   * generic start of the (work) day
   */

/**
   * @cfg {String} (H:i) defaultStart
   * generic scroll start of the (work) day
   */

/**
   * @cfg {String} action {@link Ext.data.Api#actions}
   */

/**
   * @cfg {String} activeView
   */

/**
   * @cfg {String} appName
   * internal/untranslated app name (required)
   */

/**
   * @cfg {String} calWeekString
   * i18n._('WK')
   */

/**
   * @cfg {String} containerName
   * untranslated container name
   */

/**
   * @cfg {String} containerProperty
   * name of the container property
   */

/**
   * @cfg {String} dateFormat
   * (Optional) A format string for the {@link Date#parseDate parseDate} function, or "timestamp" if the
   * value provided by the Reader is a UNIX timestamp, or "time" if the value provided by the Reader is a
   * javascript millisecond timestamp.
   */

/**
   * @cfg {String} dayFormatString
   * i18n._('{0}, the {1}. of {2}')
   */

/**
   * @cfg {String} defaultAttendeeRole
   * attendee role for new attendee row
   */

/**
   * @cfg {String} dtEndProperty
   */

/**
   * @cfg {String} dtStartProperty
   */

/**
   * @cfg {String} eventCls
   * css class of event ui
   */

/**
   * @cfg {String} grantsPath
   * path (see _.get() to find grants
   */

/**
   * @cfg {String} idProperty
   * property of the id of the record
   */

/**
   * @cfg {String} idProperty [id] Name of the property within a row object
   * that contains a record identifier value.  Defaults to <tt>id</tt>
   */

/**
   * @cfg {String} label
   * Note: must be escaped properly
   */

/**
   * @cfg {String} loadMaskText
   * i18n._('Loading events, please wait...')
   */

/**
   * @cfg {String} message
   */

/**
   * @cfg {String} messageProperty [undefined] Optional name of a property within a server-response that represents a user-feedback message.
   */

/**
   * @cfg {String} modelName
   * name of the model/record  (required)
   */

/**
   * @cfg {String} name
   * The name by which the field is referenced within the Record. This is referenced by, for example,
   * the <tt>dataIndex</tt> property in column definition objects passed to {@link Ext.grid.ColumnModel}.
   * <p>Note: In the simplest case, if no properties other than <tt>name</tt> are required, a field
   * definition may consist of just a String for the field name.</p>
   */

/**
   * @cfg {String} newEventSummary
   * i18n._('New Event')
   */

/**
   * @cfg {String} recordName
   * untranslated record/item name
   */

/**
   * @cfg {String} recordName
   * untranslated records/items (plural) name
   */

/**
   * @cfg {String} root [undefined] <b>Required</b>.  The name of the property
   * which contains the Array of row objects.  Defaults to <tt>undefined</tt>.
   * An exception will be thrown if the root property is undefined. The data
   * packet value for this property should be an empty array to clear the data
   * or show no data.
   */

/**
   * @cfg {String} sortDir
   * (Optional) Initial direction to sort (<tt>"ASC"</tt> or  <tt>"DESC"</tt>).  Defaults to
   * <tt>"ASC"</tt>.
   */

/**
   * @cfg {String} successProperty [success] Name of the property from which to
   * retrieve the success attribute. Defaults to <tt>success</tt>.  See
   * {@link Ext.data.DataProxy}.{@link Ext.data.DataProxy#exception exception}
   * for additional information.
   */

/**
   * @cfg {String} titleProperty
   * property of the title attibute, used in generic getTitle function  (required)
   */

/**
   * @cfg {String} totalProperty [total] Name of the property from which to
   * retrieve the total number of records in the dataset. This is only needed
   * if the whole dataset is not passed in one go, but is being paged from
   * the remote server.  Defaults to <tt>total</tt>.
   */

/**
   * @cfg {String} type
   * (Optional) The data type for conversion to displayable value if <tt>{@link Ext.data.Field#convert convert}</tt>
   * has not been specified. Possible values are
   * <div class="mdetail-params"><ul>
   * <li>auto (Default, implies no conversion)</li>
   * <li>string</li>
   * <li>int</li>
   * <li>float</li>
   * <li>boolean</li>
   * <li>date</li></ul></div>
   */

/**
   * @cfg {String} view
   */

/**
   * @cfg {String} viewType
   */

/**
   * @cfg {Tine.Calendar.EventEditDialog}
   */

/**
   * @cfg {Tine.Calendar.TimelineLabel} label
   */

/**
   * @cfg {Tine.Calendar.someView} view
   */

/**
   * @cfg {Tine.widgets.dialog.EditDialog}
   */

/**
   * @cfg {string} containerName
   * untranslated name of container (plural)
   */

/**
   * @cfg {} eventRecord
   * reference to event record. If set scheduling info for freebusy info will be taken from it
   */

/**
   * @cfg: {bool} copyNoAppendTitle
   * don't append "(copy)" string to title when record is copied
   */

/**
   * @event add
   * Fires when an item is added to the collection.
   * @param {Number} index The index at which the item was added.
   * @param {Object} o The item added.
   * @param {String} key The key associated with the added item.
   */

/**
   * @event addEvent
   * fired when a new event got inserted
   * 
   * @param {Tine.Calendar.Model.Event} event
   */

/**
   * @event change
   * Fired whenever a period changes
   * @param {Tine.Calendar.PagingToolbar.AbstractPeriodPicker} this
   * @param {String} corresponding view
   * @param {Array} period
   */

/**
   * @event changePeriod
   * fired when period changed
   * @param {Object} period
   */

/**
   * @event changeView
   * fired if user wants to change view
   * @param {String} requested view name
   * @param {mixed} start param of requested view
   */

/**
   * @event clear
   * Fires when the collection is cleared.
   */

/**
   * @event click
   * fired if an event got clicked
   * @param {Tine.Calendar.Model.Event} event
   * @param {Ext.EventObject} e
   */

/**
   * @event contextmenu
   * fired if an event got contextmenu 
   * @param {Ext.EventObject} e
   */

/**
   * @event dblclick
   * fired if an event got dblclicked
   * @param {Tine.Calendar.Model.Event} event
   * @param {Ext.EventObject} e
   */

/**
   * @event onBeforeAllDayScrollerResize
   * fired when an the allDayArea gets resized
   *
   * @param {Tine.Calendar.Model.DaysView} this
   * @param {number} heigt
   */

/**
   * @event remove
   * Fires when an item is removed from the collection.
   * @param {Object} o The item being removed.
   * @param {String} key (optional) The key associated with the removed item.
   */

/**
   * @event replace
   * Fires when an item is replaced in the collection.
   * @param {String} key he key associated with the new added.
   * @param {Object} old The item being replaced.
   * @param {Object} new The new item.
   */

/**
   * @event updateEvent
   * fired when an event go resised/moved
   * 
   * @param {Tine.Calendar.Model.Event} event
   */

/**
   * @ignore
   * TODO This isn't used anywhere??  Don't we want to use this where possible instead of complex #createAccessor?
   */

/**
   * @ignore
   */

/**
   * @param key
   * @param {Object} o The item to add.
   * @param suppressEvent
   */

/**
   * @param {String} value
   * @return {Ext.form.Field} this
   */

/**
   * @param {} store
   * @param {} records
   */

/**
   * @private
   * 
   * @param {Number} startIdx
   * @param {Number} endIdx
   * @return {Object}
   */

/**
   * @private
   * 
   * NOTE: Order of items matters! Ext.Layout.Border.SplitRegion.layout() does not
   *       fence the rendering correctly, as such it's impotant, so have the ftb
   *       defined after all other layout items
   */

/**
   * @private
   * @param  {Number} ts
   * @return {Number}
   */

/**
   * @private
   * @param {Ext.data.Store} ds
   */

/**
   * @private
   * @param {String} property Property to sort by ('key', 'value', or 'index')
   * @param {String} dir (optional) Direction to sort 'ASC' or 'DESC'. Defaults to 'ASC'.
   * @param {Function} fn (optional) Comparison function that defines the sort order.
   * Defaults to sorting by numeric value.
   */

/**
   * @private
   * @param {String} which
   */

/**
   * @private
   * @param {Tine.Calendar.Model.Event} event
   */

/**
   * @private
   */

/**
   * @private calculates mesh of dates for month this.startDate is in
   */

/**
   * @private periodPicker
   */

/**
   * @private returns a child div in requested position
   * 
   * @param {dom} dayCell
   * @param {Number} pos
   * @return {dom}
   */

/**
   * @private {Array} dateMesh
   */

/**
   * @private {Array} map
   * 
   * array of frames. a frames
   */

/**
   * @private {Date} toDay
   */

/**
   * @private {Number} dt
   */

/**
   * @private {Number} dtEndTs
   */

/**
   * @private {Number} dtStartTs
   */

/**
   * @private {Tine.Calendar.ParallelEventsRegistry} parallelEventsRegistry
   */

/**
   * @property
   */

/**
   * @property Tine.Tinebase.Application app
   */

/**
   * @property actionToolbar
   * @type Ext.Toolbar
   */

/**
   * @property app
   * @type Tine.Calendar.Application
   */

/**
   * @property attendeeViews
   * @type Ext.util.MixedCollection
   */

/**
   * @property autoRefreshTask
   * @type Ext.util.DelayedTask
   */

/**
   * @property eventTpl
   * @type Ext.XTemplate
   * The XTemplate used to create the headings row. By default this just uses <th> elements, override to provide your own
   */

/**
   * @property iMIPrecord
   * @type Tine.Calendar.Model.iMIP
   */

/**
   * @property mainStore store of main view
   * @type Ext.Store
   */

/**
   * @property {Ext.data.Store}
   * @private
   */

/**
   * @property {Number} scalingFactor
   * percentage per millisecond
   */

/**
   * @property {Object} byAttendee
   * fbInfo grouped by attendee
   */

/**
   * @property {Object} statusMap
   * status per attendee
   */

/**
   * @property {Tine.Calendar.Model.AttenderProxy} recordProxy
   */

/**
   * @property {Tine.Calendar.Model.Poll} poll
   */

/**
   * @see Tine.widgets.dialog.AddToRecordPanel::getFormItems()
   */

/**
   * @see Tine.widgets.dialog.AddToRecordPanel::getRelationConfig()
   */

/**
   * @see Tine.widgets.dialog.AddToRecordPanel::isValid()
   */

/**
   * @static
   */

/**
   * @todo: improve layout, rangeslidercomponent can't deal with resizing! Techically it can but it's extremely slow atm!
   */

/**
   * Abstract method created in extension's buildExtractors impl.
   */

/**
   * Abstract method overridden in DataReader extensions such as {@link Ext.data.JsonReader} and {@link Ext.data.XmlReader}
   */

/**
   * Abstract method, overridden in DataReader extensions such as {@link Ext.data.JsonReader} and {@link Ext.data.XmlReader}
   */

/**
   * Adds all elements of an Array or an Object to the collection.
   * @param {Object/Array} objs An Object containing properties which will be added
   * to the collection, or an Array of values, each of which are added to the collection.
   * Functions references will be added to the collection if <code>{@link #allowFunctions}</code>
   * has been set to <tt>true</tt>.
   * @param suppressEvent
   */

/**
   * Adds an item to the collection. Fires the {@link #add} event when complete.
   * @param {String} key <p>The key to associate with the item, or the new item.</p>
   * <p>If a {@link #getKey} implementation was specified for this MixedCollection,
   * or if the key of the stored items is in a property called <tt><b>id</b></tt>,
   * the MixedCollection will be able to <i>derive</i> the key for the new item.
   * In this case just pass the new item in this parameter.</p>
   * @param {Object} o The item to add.
   * @param suppressEvent
   * @return {Object} The item added.
   */

/**
   * Adds the specified events to the list of events which this Observable may fire.
   * @param {Object|String} o Either an object with event names as properties with a value of <code>true</code>
   * or the first event name string if multiple event names are being passed as separate parameters.
   * @param {string} Optional. Event name if multiple event names are being passed as separate parameters.
   * Usage:<pre><code>
  this.addEvents('storeloaded', 'storecleared');
  </code></pre>
   */

/**
   * Allows you to define a tokenized string and pass an arbitrary number of arguments to replace the tokens.  Each
   * token must be unique, and must increment in the format {0}, {1}, etc.  Example usage:
   * <pre><code>
  var cls = 'my-class', text = 'Some text';
  var s = String.format('&lt;div class="{0}">{1}&lt;/div>', cls, text);
  // s now contains the string: '&lt;div class="my-class">Some text&lt;/div>'
   * </code></pre>
   * @param {String} string The tokenized string to be formatted
   * @param {String} value1 The value to replace token {0}
   * @param {String} value2 Etc...
   * @return {String} The formatted string
   * @static
   */

/**
   * An object hash representing the data for this Record. Every field name in the Record definition
   * is represented by a property of that name in this object. Note that unless you specified a field
   * with {@link Ext.data.Field#name name} "id" in the Record definition, this will <b>not</b> contain
   * an <tt>id</tt> property.
   * @property data
   * @type {Object}
   */

/**
   * Appends an event handler to this object.
   * @param {String}   eventName The name of the event to listen for.
   * @param {Function} handler The method the event invokes.
   * @param {Object}   scope (optional) The scope (<code><b>this</b></code> reference) in which the handler function is executed.
   * <b>If omitted, defaults to the object which fired the event.</b>
   * @param {Object}   options (optional) An object containing handler configuration.
   * properties. This may contain any of the following properties:<ul>
   * <li><b>scope</b> : Object<div class="sub-desc">The scope (<code><b>this</b></code> reference) in which the handler function is executed.
   * <b>If omitted, defaults to the object which fired the event.</b></div></li>
   * <li><b>delay</b> : Number<div class="sub-desc">The number of milliseconds to delay the invocation of the handler after the event fires.</div></li>
   * <li><b>single</b> : Boolean<div class="sub-desc">True to add a handler to handle just the next firing of the event, and then remove itself.</div></li>
   * <li><b>buffer</b> : Number<div class="sub-desc">Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed
   * by the specified number of milliseconds. If the event fires again within that time, the original
   * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</div></li>
   * <li><b>target</b> : Observable<div class="sub-desc">Only call the handler if the event was fired on the target Observable, <i>not</i>
   * if the event was bubbled up from a child Observable.</div></li>
   * </ul><br>
   * <p>
   * <b>Combining Options</b><br>
   * Using the options argument, it is possible to combine different types of listeners:<br>
   * <br>
   * A delayed, one-time listener.
   * <pre><code>
  myDataView.on('click', this.onClick, this, {
  single: true,
  delay: 100
  });</code></pre>
   * <p>
   * <b>Attaching multiple handlers in 1 call</b><br>
   * The method also allows for a single argument to be passed which is a config object containing properties
   * which specify multiple handlers.
   * <p>
   * <pre><code>
  myGridPanel.on({
  'click' : {
  fn: this.onClick,
  scope: this,
  delay: 100
  },
  'mouseover' : {
  fn: this.onMouseOver,
  scope: this
  },
  'mouseout' : {
  fn: this.onMouseOut,
  scope: this
  }
  });</code></pre>
  * <p>
  * Or a shorthand syntax:<br>
  * <pre><code>
  myGridPanel.on({
  'click' : this.onClick,
  'mouseover' : this.onMouseOver,
  'mouseout' : this.onMouseOut,
  scope: this
  });</code></pre>
   */

/**
   * Begin an edit. While in edit mode, no events (e.g.. the <code>update</code> event)
   * are relayed to the containing store.
   * See also: <code>{@link #endEdit}</code> and <code>{@link #cancelEdit}</code>.
   */

/**
   * Binds the paging toolbar to the specified {@link Ext.data.Store}
   * @param {Ext.data.Store} store The data store to bind
   */

/**
   * By default returns <tt>false</tt> if any {@link Ext.data.Field field} within the
   * record configured with <tt>{@link Ext.data.Field#allowBlank} = false</tt> returns
   * <tt>true</tt> from an {@link Ext}.{@link Ext#isEmpty isempty} test.
   * @return {Boolean}
   */

/**
   * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage:
   * <pre><code>
  var sayHi = function(name){
  alert('Hi, ' + name);
  }
  // executes immediately:
  sayHi('Fred');
  // executes after 2 seconds:
  sayHi.defer(2000, this, ['Fred']);
  // this syntax is sometimes useful for deferring
  // execution of an anonymous function:
  (function(){
  alert('Anonymous');
  }).defer(100);
  </code></pre>
   * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
   * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
   * <b>If omitted, defaults to the browser window.</b>
   * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
   * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
   * if a number the args are inserted at the specified position
   * @return {Number} The timeout id that can be used with clearTimeout
   */

/**
   * Cancel the last queued timeout
   */

/**
   * Cancels all changes made in the current edit operation.
   */

/**
   * Cancels any pending timeout and queues a new one
   * @param {Number} delay The milliseconds to delay
   * @param {Function} newFn (optional) Overrides function passed to constructor
   * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope
   * is specified, <code>this</code> will refer to the browser window.
   * @param {Array} newArgs (optional) Overrides args passed to constructor
   */

/**
   * Case insensitive string
   * @param {Mixed} s The value being converted
   * @return {String} The comparison value
   */

/**
   * Checks to see if this object has any listeners for a specified event
   * @param {String} eventName The name of the event to check for
   * @return {Boolean} True if the event is being listened for, else false
   */

/**
   * Checks whether or not the current number is within a desired range.  If the number is already within the
   * range it is returned, otherwise the min or max value is returned depending on which side of the range is
   * exceeded.  Note that this method returns the constrained value but does not change the current number.
   * @param {Number} min The minimum number in the range
   * @param {Number} max The maximum number in the range
   * @return {Number} The constrained value if outside the range, otherwise the current value
   */

/**
   * Checks whether or not the specified object exists in the array.
   * @param {Object} o The object to check for
   * @param {Number} from (Optional) The index at which to begin the search
   * @return {Number} The index of o in the array (or -1 if it is not found)
   */

/**
   * Confirm application restart
   *
   * @param Boolean closewindow
   */

/**
   * Create a combined function call sequence of the original function + the passed function.
   * The resulting function returns the results of the original function.
   * The passed fcn is called with the parameters of the original function. Example usage:
   * <pre><code>
  var sayHi = function(name){
  alert('Hi, ' + name);
  }
  sayHi('Fred'); // alerts "Hi, Fred"
  var sayGoodbye = sayHi.createSequence(function(name){
  alert('Bye, ' + name);
  });
  sayGoodbye('Fred'); // both alerts show
  </code></pre>
   * @param {Function} fcn The function to sequence
   * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
   * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
   * @return {Function} The new function
   */

/**
   * Create a data block containing Ext.data.Records from a JSON object.
   * @param {Object} o An object which contains an Array of row objects in the property specified
   * in the config as 'root, and optionally a property, specified in the config as 'totalProperty'
   * which contains the total size of the dataset.
   * @return {Object} data A data block which is used by an Ext.data.Store object as
   * a cache of Ext.data.Records.
   */

/**
   * Creates a copy (clone) of this Record.
   * @param {String} id (optional) A new Record id, defaults to the id
   * of the record being copied. See {@link #id}.
   * To generate a phantom record with a new id use:
   var rec = record.copy(); // clone the record
   Ext.data.Record.id(rec); // automatically generate a unique sequential id
   *
   * @return {Record}
   */

/**
   * Creates a delegate (callback) that sets the scope to obj.
   * Call directly on any function. Example: <code>this.myFunction.createDelegate(this, [arg1, arg2])</code>
   * Will create a function that is automatically scoped to obj so that the <tt>this</tt> variable inside the
   * callback points to obj. Example usage:
   * <pre><code>
  var sayHi = function(name){
  // Note this use of "this.text" here.  This function expects to
  // execute within a scope that contains a text property.  In this
  // example, the "this" variable is pointing to the btn object that
  // was passed in createDelegate below.
  alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
  }
  var btn = new Ext.Button({
  text: 'Say Hi',
  renderTo: Ext.getBody()
  });
  // This callback will execute in the scope of the
  // button instance. Clicking the button alerts
  // "Hi, Fred. You clicked the "Say Hi" button."
  btn.on('click', sayHi.createDelegate(btn, ['Fred']));
  </code></pre>
   * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
   * <b>If omitted, defaults to the browser window.</b>
   * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
   * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
   * if a number the args are inserted at the specified position
   * @return {Function} The new function
   */

/**
   * Creates a recuring event exception
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @param {Boolean} deleteInstance
   * @param {Boolean} deleteAllFollowing
   * @param {Object} options
   * @return {String} transaction id
   */

/**
   * Creates a shallow copy of this collection
   * @return {MixedCollection}
   */

/**
   * Creates namespaces to be used for scoping variables and classes so that they are not global.
   * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
   * <pre><code>
  Ext.namespace('Company', 'Company.data');
  Ext.namespace('Company.data'); // equivalent and preferable to above syntax
  Company.Widget = function() { ... }
  Company.data.CustomStore = function(config) { ... }
  </code></pre>
   * @param {String} namespace1
   * @param {String} namespace2
   * @param {String} etc
   * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created)
   * @method ns
   */

/**
   * Date sorting
   * @param {Mixed} s The value being converted
   * @return {Number} The comparison value
   */

/**
   * Decode a json response from server.
   * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
   * @param {Object} response
   * TODO: refactor code between JsonReader#readRecords, #readResponse into 1 method.
   * there's ugly duplication going on due to maintaining backwards compat. with 2.0.  It's time to do this.
   */

/**
   * Default sort that does nothing
   * @param {Mixed} s The value being converted
   * @return {Mixed} The comparison value
   */

/**
   * End an edit. If any data was modified, the containing store is notified
   * (ie, the store's <code>update</code> event will fire).
   */

/**
   * Escapes the passed string for ' and \
   * @param {String} string The string to escape
   * @return {String} The escaped string
   * @static
   */

/**
   * Executes the specified function once for every item in the collection, passing the following arguments:
   * <div class="mdetail-params"><ul>
   * <li><b>item</b> : Mixed<p class="sub-desc">The collection item</p></li>
   * <li><b>index</b> : Number<p class="sub-desc">The item's index</p></li>
   * <li><b>length</b> : Number<p class="sub-desc">The total number of items in the collection</p></li>
   * </ul></div>
   * The function should return a boolean value. Returning false from the function will stop the iteration.
   * @param {Function} fn The function to execute for each item.
   * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function is executed. Defaults to the current item in the iteration.
   */

/**
   * Executes the specified function once for every key in the collection, passing each
   * key, and its associated item as the first two parameters.
   * @param {Function} fn The function to execute for each item.
   * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function is executed. Defaults to the browser window.
   */

/**
   * Filter by a function. Returns a <i>new</i> collection that has been filtered.
   * The passed function will be called with each object in the collection.
   * If the function returns true, the value is included otherwise it is filtered.
   * @param {Function} fn The function to be called, it will receive the args o (the object), k (the key)
   * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function is executed. Defaults to this MixedCollection.
   * @return {MixedCollection} The new filtered collection
   */

/**
   * Filter the <i>objects</i> in this collection by a specific property.
   * Returns a new collection that has been filtered.
   * @param {String} property A property on your objects
   * @param {String/RegExp} value Either string that the property values
   * should start with or a RegExp to test against the property
   * @param {Boolean} anyMatch (optional) True to match any part of the string, not just the beginning
   * @param {Boolean} caseSensitive (optional) True for case sensitive comparison (defaults to False).
   * @return {MixedCollection} The new filtered collection
   */

/**
   * Find the index of the first matching object in this collection by a function.
   * If the function returns <i>true</i> it is considered a match.
   * @param {Function} fn The function to be called, it will receive the args o (the object), k (the key).
   * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function is executed. Defaults to this MixedCollection.
   * @param {Number} start (optional) The index to start searching at (defaults to 0).
   * @return {Number} The matched index or -1
   */

/**
   * Finds the index of the first matching object in this collection by a specific property/value.
   * @param {String} property The name of a property on your objects.
   * @param {String/RegExp} value A string that the property values
   * should start with or a RegExp to test against the property.
   * @param {Number} start (optional) The index to start searching at (defaults to 0).
   * @param {Boolean} anyMatch (optional) True to match any part of the string, not just the beginning.
   * @param {Boolean} caseSensitive (optional) True for case sensitive comparison.
   * @return {Number} The matched index or -1
   */

/**
   * Float sorting
   * @param {Mixed} s The value being converted
   * @return {Float} The comparison value
   */

/**
   * Get a time period of a given slider range
   *
   *    0:0:0 - 23:59:59
   *
   * @param range
   * @return {{from: *, until: *}}
   */

/**
   * Get content panel of calendar application
   *
   * @return {Tine.Calendar.MainScreenCenterPanel}
   */

/**
   * Get the value of the {@link Ext.data.Field#name named field}.
   * @param {String} name The {@link Ext.data.Field#name name of the field} to get the value of.
   * @return {Object} The value of the field.
   */

/**
   * Get the value of the {@link Field#name named field}.
   * @param {String} name The {@link Field#name name of the field} to get the value of.
   * @return {Object} The value of the field.
   */

/**
   * Get translated application title of the calendar application
   *
   * @return {String}
   */

/**
   * Gets a hash of only the fields that have been modified since this Record was created or commited.
   * @return Object
   */

/**
   * Gets the number of selected events.
   * @return {Number}
   */

/**
   * HTML-encodes a string twice
   * @param {String} value
   * @return {String}
   */

/**
   * Inserts an item at the specified index in the collection. Fires the {@link #add} event when complete.
   * @param {Number} index The index to insert the item at.
   * @param {String} key The key to associate with the new item, or the item itself.
   * @param {Object} o (optional) If the second parameter was a key, the new item.
   * @return {Object} The item inserted.
   */

/**
   * Integer sorting
   * @param {Mixed} s The value being converted
   * @return {Number} The comparison value
   */

/**
   * Is called on copy to clipboard
   *
   * @param action
   * @param event
   */

/**
   * Math.trunc polyfill
   *
   * https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
   *
   * @param x
   * @return {*}
   */

/**
   * Pads the left side of a string with a specified character.  This is especially useful
   * for normalizing number and date strings.  Example usage:
   * <pre><code>
  var s = String.leftPad('123', 5, '0');
  // s now contains the string: '00123'
   * </code></pre>
   * @param {String} string The original string
   * @param {Number} size The total length of the output string
   * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ")
   * @return {String} The padded string
   * @static
   */

/**
   * Readonly flag - true if this Record has been modified.
   * @type Boolean
   */

/**
   * Reload store when combobox is cleared
   */

/**
   * Remove an item from a specified index in the collection. Fires the {@link #remove} event when complete.
   * @param {Number} index The index within the collection of the item to remove.
   * @return {Object} The item removed or false if no item was removed.
   */

/**
   * Remove an item from the collection.
   * @param {Object} o The item to remove.
   * @return {Object} The item removed or false if no item was removed.
   */

/**
   * Removed an item associated with the passed key fom the collection.
   * @param {String} key The key of the item to remove.
   * @return {Object} The item removed or false if no item was removed.
   */

/**
   * Removes all items from the collection.  Fires the {@link #clear} event when complete.
   */

/**
   * Removes all listeners for this object
   */

/**
   * Removes an event handler.
   * @param {String}   eventName The type of event the handler was associated with.
   * @param {Function} handler   The handler to remove. <b>This must be a reference to the function passed into the {@link #addListener} call.</b>
   * @param {Object}   scope     (optional) The scope originally specified for the handler.
   */

/**
   * Removes the specified object from the array.  If the object is not found nothing happens.
   * @param {Object} o The object to remove
   * @return {Array} this array
   */

/**
   * Renders a float or integer as percent
   *
   * @param {Number} v The number to format.
   * @see Ext.util.Format.number
   *
   * @return {String} The formatted number.
   */

/**
   * Replaces an item in the collection. Fires the {@link #replace} event when complete.
   * @param {String} key <p>The key associated with the item to replace, or the replacement item.</p>
   * <p>If you supplied a {@link #getKey} implementation for this MixedCollection, or if the key
   * of your stored items is in a property called <tt><b>id</b></tt>, then the MixedCollection
   * will be able to <i>derive</i> the key of the replacement item. If you want to replace an item
   * with one having the same key value, then just pass the replacement item in this parameter.</p>
   * @param o {Object} o (optional) If the first parameter passed was a key, the item to associate
   * with that key.
   * @return {Object}  The new item.
   */

/**
   * Resume firing events. (see {@link #suspendEvents})
   * If events were suspended using the <tt><b>queueSuspended</b></tt> parameter, then all
   * events fired during event suspension will be sent to any listeners now.
   */

/**
   * Retruns calendar View
   * 
   * @return {Tine.Calendar.View}
   */

/**
   * Return CSS class to apply to rows depending upon due status
   * 
   * @param {Tine.Tasks.Task} record
   * @param {Integer} index
   * @return {String}
   */

/**
   * Returns <tt>true</tt> if the passed field name has been <code>{@link #modified}</code>
   * since the load or last commit.
   * @param {String} fieldName {@link Ext.data.Field.{@link Ext.data.Field#name}
   * @return {Boolean}
   */

/**
   * Returns a panel with a text field for a remote location and a description
   * 
   * @returns {Object}
   */

/**
   * Returns a panel with a upload field and descriptions
   * 
   * @returns {Object}
   */

/**
   * Returns a range of items in this collection
   * @param {Number} startIndex (optional) The starting index. Defaults to 0.
   * @param {Number} endIndex (optional) The ending index. Defaults to the last item.
   * @return {Array} An array of items
   */

/**
   * Returns a username or groupname with according icon in front
   */

/**
   * Returns account type icon
   *
   * @return String
   */

/**
   * Returns an array of the selected events
   * @return {Array}
   */

/**
   * Returns data store
   * 
   * @deprecated
   * @return {Ext.data.Store}
   */

/**
   * Returns dropdown hint icon for editor grid columns with comboboxes
   *
   * @return String
   */

/**
   * Returns emails from string or recipient token
   * @param emails
   */

/**
   * Returns index within the collection of the passed Object.
   * @param {Object} o The item to find the index of.
   * @return {Number} index of the item. Returns -1 if not found.
   */

/**
   * Returns index within the collection of the passed key.
   * @param {String} key The key to find the index of.
   * @return {Number} index of the key.
   */

/**
   * Returns localised date and time string
   *
   * @param {mixed} $_iso8601
   * @param metadata
   * @see date
   * @return {String} localised date and time
   */

/**
   * Returns localised date string
   *
   * @param {mixed} date
   * @param metadata
   * @param formatArray
   * @see Ext.util.Format.date
   * @return {String} localised date
   */

/**
   * Returns localised number string with two digits if no format is given
   *
   * @param {Number} v The number to format.
   * @param {String} format The way you would like to format this text.
   * @see Ext.util.Format.number
   *
   * @return {String} The formatted number.
   */

/**
   * Returns localised time string
   *
   * @param {mixed} date
   * @param metadata
   * @see Ext.util.Format.date
   * @return {String} localised time
   */

/**
   * Returns prettyfied minutes
   *
   * @param  {Number} minutes
   * @param  format -> {0} will be replaced by Hours, {1} with minutes
   * @param  {String} leadingZeros add leading zeros for given item {i|H}
   * @return {String}
   */

/**
   * Returns prettyfied seconds
   *
   * @param  {Number} seconds
   * @return {String}
   */

/**
   * Returns rendered containers
   *
   * @TODO show qtip with grants
   *
   * @param {mixed} container
   * @return {String}
   */

/**
   * Returns rendered relations
   *
   * @param {mixed} container
   * @return {String}
   *
   * TODO use/invent renderer registry to show more information on relations
   */

/**
   * Returns rendered tags for grids
   *
   * @param {mixed} tags
   * @return {String} tags as colored squares with qtips
   *
   * TODO add style for tag divs
   */

/**
   * Returns selection model
   * 
   * @deprecated
   * @return {Tine.Calendar.EventSelectionModel}
   */

/**
   * Returns the HTML that will be placed into the <head> element of th print window.
   * @param {Ext.Component} component The component to render
   * @return {String} The HTML fragment to place inside the print window's <head> element
   */

/**
   * Returns the first item in the collection which elicits a true return value from the
   * passed selection function.
   * @param {Function} fn The selection function to execute for each item.
   * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function is executed. Defaults to the browser window.
   * @return {Object} The first item in the collection which returned true from the selection function.
   */

/**
   * Returns the first item in the collection.
   * @return {Object} the first item in the collection..
   */

/**
   * Returns the first selected event.
   * @return {Record}
   */

/**
   * Returns the formated username
   *
   * @param {object} account object
   * @return {string} formated user display name
   */

/**
   * Returns the item associated with the passed key OR index.
   * Key has priority over index.  This is the equivalent
   * of calling {@link #key} first, then if nothing matched calling {@link #itemAt}.
   * @param {String/Number} key The key or index of the item.
   * @return {Object} If the item is found, returns the item.  If the item was not found, returns <tt>undefined</tt>.
   * If an item was found, but is a Class, returns <tt>null</tt>.
   */

/**
   * Returns the item associated with the passed key.
   * @param {String/Number} key The key of the item.
   * @return {Object} The item associated with the passed key.
   */

/**
   * Returns the item at the specified index.
   * @param {Number} index The index of the item.
   * @return {Object} The item at the specified index.
   */

/**
   * Returns the last item in the collection.
   * @return {Object} the last item in the collection..
   */

/**
   * Returns the number of items in the collection.
   * @return {Number} the number of items in the collection.
   */

/**
   * Returns true if the collection contains the passed Object as a key.
   * @param {String} key The key to look for in the collection.
   * @return {Boolean} True if the collection contains the Object as a key.
   */

/**
   * Returns true if the collection contains the passed Object as an item.
   * @param {Object} o  The Object to look for in the collection.
   * @return {Boolean} True if the collection contains the Object as an item.
   */

/**
   * Returns true if the supplied data-hash <b>looks</b> and quacks like data.  Checks to see if it has a key
   * corresponding to idProperty defined in your DataReader config containing non-empty pk.
   * @param {Object} data
   * @return {Boolean}
   */

/**
   * Select an event.
   * 
   * @param {Tine.Calendar.Model.Event} event The event to select
   * @param {EventObject} e (optional) An event associated with the selection
   * @param {Boolean} keepExisting True to retain existing selections
   * @return {Tine.Calendar.Model.Event} The selected event
   */

/**
   * Set the value of the {@link Field#name named field}.
   * @param {String} name The {@link Field#name name of the field} to get the value of.
   * @return {Object} this.
   */

/**
   * Set the {@link Ext.data.Field#name named field} to the specified value.  For example:
   * <pre><code>
  // record has a field named 'firstname'
  var Employee = Record.{@link #create}([
  {name: 'firstname'},
  ...
  ]);
  // update the 2nd record in the store:
  var rec = myStore.{@link Ext.data.Store#getAt getAt}(1);
  // set the value (shows dirty flag):
  rec.set('firstname', 'Betty');
  // commit the change (removes dirty flag):
  rec.{@link #commit}();
  // update the record in the store, bypass setting dirty flag,
  // and do not store the change in the {@link Ext.data.Store#getModifiedRecords modified records}
  rec.{@link #data}['firstname'] = 'Wilma'; // updates record, but not the view
  rec.{@link #commit}(); // updates the view
   * </code></pre>
   * <b>Notes</b>:<div class="mdetail-params"><ul>
   * <li>If the store has a writer and <code>autoSave=true</code>, each set()
   * will execute an XHR to the server.</li>
   * <li>Use <code>{@link #beginEdit}</code> to prevent the store's <code>update</code>
   * event firing while using set().</li>
   * <li>Use <code>{@link #endEdit}</code> to have the store's <code>update</code>
   * event fire.</li>
   * </ul></div>
   * @param {String} name The {@link Ext.data.Field#name name of the field} to set.
   * @param {String/Object/Array} value The value to set the field to.
   * @return {Object} this.
   */

/**
   * Sorts this collection by <b>item</b> value with the passed comparison function.
   * @param {String} direction (optional) 'ASC' or 'DESC'. Defaults to 'ASC'.
   * @param {Function} fn (optional) Comparison function that defines the sort order.
   * Defaults to sorting by numeric value.
   */

/**
   * Sorts this collection by <b>key</b>s.
   * @param {String} direction (optional) 'ASC' or 'DESC'. Defaults to 'ASC'.
   * @param {Function} fn (optional) Comparison function that defines the sort order.
   * Defaults to sorting by case insensitive string.
   */

/**
   * Strips all HTML tags to sort on text only
   * @param {Mixed} s The value being converted
   * @return {String} The comparison value
   */

/**
   * Strips all HTML tags to sort on text only - Case insensitive
   * @param {Mixed} s The value being converted
   * @return {String} The comparison value
   */

/**
   * Suspend the firing of all events. (see {@link #resumeEvents})
   * @param {Boolean} queueSuspended Pass as true to queue up suspended events to be fired
   * after the {@link #resumeEvents} call instead of discarding all suspended events;
   */

/**
   * The amount of space to reserve for the scrollbar (defaults to 19 pixels)
   * @property {Number}
   * @private
   */

/**
   * The minmum all day height in px
   * @property Number
   * @private
   */

/**
   * The record currently being edited
   * 
   * @type Tine.Calendar.Model.Event
   * @property record
   */

/**
   * The regular expression used to strip tags
   * @type {RegExp}
   * @property
   */

/**
   * The time in milliseconds, a scroll should be delayed after using the mousewheel
   * @property Number
   * @private
   */

/**
   * The unique ID of the Record {@link #Record as specified at construction time}.
   * @property id
   * @type {Object}
   */

/**
   * The version of the framework
   * @type String
   */

/**
   * This DataReader's configured metadata as passed to the constructor.
   * @type Mixed
   * @property meta
   */

/**
   * This JsonReader's metadata as passed to the constructor, or as passed in
   * the last data packet's <b><tt>metaData</tt></b> property.
   * @type Mixed
   * @property meta
   */

/**
   * This method is only used by a DataProxy which has retrieved data from a remote server.
   * @param {Object} response The XHR object which contains the JSON data in its responseText.
   * @return {Object} data A data block which is used by an Ext.data.Store object as
   * a cache of Ext.data.Records.
   */

/**
   * This object contains a key and value storing the original values of all modified
   * fields or is null if no fields have been modified.
   * @property modified
   * @type {Object}
   */

/**
   * To show or hide the paging toolbar
   */

/**
   * Unbinds the paging toolbar from the specified {@link Ext.data.Store}
   * @param {Ext.data.Store} store The data store to unbind
   */

/**
   * Updates given record with data from this panel
   * called by edit dialog to get data
   * 
   * @param {Tine.Calendar.Model.Event} record
   */

/**
   * Used for un-phantoming a record after a successful database insert.  Sets the records pk along with new data from server.
   * You <b>must</b> return at least the database pk using the idProperty defined in your DataReader configuration.  The incoming
   * data from server will be merged with the data in the local record.
   * In addition, you <b>must</b> return record-data from the server in the same order received.
   * Will perform a commit as well, un-marking dirty-fields.  Store's "update" event will be suppressed.
   * @param {Record/Record[]} record The phantom record to be realized.
   * @param {Object/Object[]} data The new record data to apply.  Must include the primary-key from database defined in idProperty field.
   */

/**
   * Used for updating a non-phantom or "real" record's data with fresh data from server after remote-save.
   * If returning data from multiple-records after a batch-update, you <b>must</b> return record-data from the server in
   * the same order received.  Will perform a commit as well, un-marking dirty-fields.  Store's "update" event will be
   * suppressed as the record receives fresh new data-hash
   * @param {Record/Record[]} rs
   * @param {Object/Object[]} data
   */

/**
   * Usually called by the {@link Ext.data.Store} which owns the Record.
   * Commits all changes made to the Record since either creation, or the last commit operation.
   * <p>Developers should subscribe to the {@link Ext.data.Store#update} event
   * to have their code notified of commit operations.</p>
   * @param {Boolean} silent (optional) True to skip notification of the owning
   * store of the change (defaults to false)
   */

/**
   * Usually called by the {@link Ext.data.Store} which owns the Record.
   * Rejects all changes made to the Record since either creation, or the last commit operation.
   * Modified fields are reverted to their original values.
   * <p>Developers should subscribe to the {@link Ext.data.Store#update} event
   * to have their code notified of reject operations.</p>
   * @param {Boolean} silent (optional) True to skip notification of the owning
   * store of the change (defaults to false)
   */

/**
   * add hint if events are outside visible area
   * 
   * @param {} e
   * @param {} t
   * @param {} o
   */

/**
   * add records from other applications using the split add button
   * - activated by default
   * 
   * @type Bool
   * @property splitAddButton
   */

/**
   * adjusts given date (end/start) to user preference (hours)
   * 
   * @param {Date} dateValue
   * @param {String} prefKey
   * @return {Date}
   */

/**
   * adopt attr
   * 
   * @param {Object} attr
   */

/**
   * apply Ext.encode as toString functino to given object
   *
   * @param {mixed} o
   */

/**
   * assert that given object is comparable
   *
   * @param {mixed} o
   * @param {bool} clone
   * @return {mixed} o
   */

/**
   * auto hook text i18n._('New Event')
   */

/**
   * autosave
   */

/**
   * buffered version of this.unbufferedOnLayout
   * @see this.initComponent
   */

/**
   * bus notified about record changes
   */

/**
   * called before store queries for data
   */

/**
   * called when events are droped on a calendar node
   * 
   * NOTE: atm. event panels only allow d&d for single events
   * 
   * @private
   * @param  {Ext.Event} dropEvent
   * @return {Boolean}
   */

/**
   * called when import request sends response
   * 
   * @param {Object}   request
   * @param {Boolean}  success
   * @param {Object}   response
   * @param {Function} callback
   */

/**
   * called when store loaded data
   */

/**
   * cancel collapse if ctx menu is shown
   */

/**
   * check if user has right to view/manage this application/resource
   *
   * @param   {String}      right (view, admin, manage)
   * @param   {String}      application
   * @param   {String}      resource (for example roles, accounts, ...)
   * @returns {Boolean}
   */

/**
   * check valid email domain (if email domain is set in config)
   *
   * @param {String} email
   */

/**
   * check whether given value can be interpreted as true
   *
   * @param {String|Integer|Boolean} value
   * @return {Boolean}
   */

/**
   * check whether object is empty (has no property)
   *
   * @param {Object} obj
   * @return {Boolean}
   */

/**
   * checks if a slice in a given frame is free
   * 
   * @private
   * @param {Array} frame
   * @param {Number} startIdx
   * @param {Number} endIdx
   */

/**
   * checks if form data is valid
   * 
   * @return {Boolean}
   */

/**
   * checks, if the last filter still matches after update
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @param {Tine.Calendar.Model.Event} updatedEvent
   */

/**
   * clone function
   *
   * @param {Object/Array} o Object or array to clone
   * @return {Object/Array} Deep clone of an object or an array
   */

/**
   * collapses the result list only when periodpicker is not active
   * @return {Boolean}
   */

/**
   * color renderer
   *
   * @param color
   */

/**
   * color sets for colors from colorPalette
   * 
   * @type Array 
   * @property colorSchemata
   */

/**
   * converts data to String
   * 
   * @return {String}
   */

/**
   * copy record
   * 
   * TODO change attender status?
   */

/**
   * create bogus attendee record for directly entered email-addresses
   */

/**
   * creates a new event directly from this view
   * @param {} event
   */

/**
   * ctx menu
   * 
   * @type Ext.menu.Menu
   * @property ctxMenu
   */

/**
   * currency renderer
   *
   * @param currency
   */

/**
   * default duration for new events
   */

/**
   * default filter
   * @type {string}
   */

/**
   * default panel w.o. data
   * 
   * @return {Ext.ux.display.DisplayPanel}
   */

/**
   * default print mode
   * 
   * @type String {sheet|grid}
   * @property defaultPrintMode
   */

/**
   * delete a recuring event series
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @param {Object} options
   * @return {String} transaction id
   */

/**
   * disable contents not panel
   */

/**
   * display event in mainscreen
   * @param {String} id
   *
   * example:
   * http://tine20.example.com:10443/#/Calendar/showEvent/89192f9d3ce44ed3681a1b73d5ca491e766c4d62
   */

/**
   * dissalow loading of all and otherUsers node
   * 
   * @param {Ext.tree.TreeNode} node
   * @param {Ext.EventObject} e
   * @return {Boolean}
   */

/**
   * do import request
   * 
   * @param {Function} callback
   * @param {Object}   importOptions
   */

/**
   * executed after record got updated from proxy
   */

/**
   * extract attendee filter from filters
   *
   * @param {Array} filters
   */

/**
   * extract attendee filter values from filters
   *
   * @param {Array} filters
   */

/**
   * fetches elements from our generated dom
   */

/**
   * fill the events into the view
   */

/**
   * find contacts by email string
   *
   * return recipients token
   *
   * @param addresses
   */

/**
   * find record from target
   *
   * @param target
   */

/**
   * foreign record renderer
   *
   * @param record
   * @param metadata
   *
   * TODO use title fn? allow to configure displayed field(s)?
   */

/**
   * format byte values
   * @param {String} value
   * @param {String} forceUnit
   * @param {Integer} decimals
   * @param {Boolean} useDecimalValues
   */

/**
   * generic apply changes handler
   * @param {Boolean} closeWindow
   */

/**
   * get checked attendee
   */

/**
   * get copy action
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @return {Object}
   */

/**
   * get current view type (Grid/Day/Week/...)
   *
   * @param {String} view
   * @returns {Boolean}
   */

/**
   * get date of a (event) target
   * 
   * @param {Ext.EventObject} e
   * @param {number} graticule
   * @param {char} graticuleEdge one of n (north) s, (south)
   * @return {Date}
   */

/**
   * get detailed info (HTML) for a single attendee
   *
   * @param {Record} attendee
   */

/**
   * get detailed info (HTML) grouped by attendee
   *
   * @param {Store} attendees
   */

/**
   * get diff of resizeable
   *
   * @param {Ext.Resizeable} rz
   */

/**
   * get eventStatusAction action
   *
   * @param {Tine.Calendar.Model.Event} event
   * @return {Object}
   */

/**
   * get height in % of the diff for the given dates
   *
   * @param {date} dtStart
   * @param {date} dtEnd
   * @returns {number}
   */

/**
   * get height in px of the diff for the given dates (with current scaling)
   *
   * @param {date} dtStart
   * @param {date} dtEnd
   * @returns {number}
   */

/**
   * get max state of all attendee
   *
   * @return {Number} one of Tine.Calendar.FreeBusyInfo.states
   */

/**
   * get north panel for given contentType
   *
   * @param {String} contentType
   * @return {Ext.Panel}
   */

/**
   * get number of maximal parallel events in given time span
   * 
   * @param {Date} dtStart
   * @param {Date} dtEnd
   * @return {Number}
   */

/**
   * get number of minutes represented by height in px (current scaleing)
   *
   * @param {number} height
   * @returns {number}
   */

/**
   * get offset in % for the time part of given date
   *
   * @param {date|number} date
   * @returns {number}
   */

/**
   * get offset in px for the time part of given date (with current scaling)
   *
   * @param {date} date
   * @returns {number}
   */

/**
   * get position of given event
   * 
   * @param {Ext.data.Record} event
   * @return {Number}
   */

/**
   * get response action
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @return {Object}
   */

/**
   * get short info (HTML with hover) for a single attendee
   *
   * @param {Record} attendee
   * @param {Record} event
   * @return {Number} one of Tine.Calendar.FreeBusyInfo.states
   */

/**
   * getMessage
   * @return {String}
   */

/**
   * getName
   * @return {String}
   */

/**
   * gets HTML fragment of the day columns
   */

/**
   * gets HTML fragment of the horizontal time rows
   */

/**
   * gets HTML fragment of the time over rows
   */

/**
   * gets event el of target
   *
   * @param {Ext.EventObject} e
   * @return {Tine.Calendar.Model.Event}
   */

/**
   * gets name of attender
   *
   * @return {String}
   */

/**
   * give new attendee an extra cls
   */

/**
   * gray color set
   * 
   * @type Object 
   * @property gray
   */

/**
   * grid panel phone hook for calling attendee
   * 
   * @type Tine.Phone.AddressbookGridPanelHook
   */

/**
   * grid specific
   * @private
   */

/**
   * hack for container only support
   * 
   * @param {Tine.Calendar.Model.Evnet} event
   * @return {Object} colorset
   */

/**
   * i18n renderer
   *
   * NOTE: needs to be bound to i18n object!
   *
   * renderer: Tine.Tinebase.common.i18nRenderer.createDelegate(this.app.i18n)
   * @param original
   */

/**
   * iMIP action toolbar
   */

/**
   * id of current account
   * 
   * @type Number
   * @property currentAccountId
   */

/**
   * if this addRelations is set, iterate and create attendee
   */

/**
   * import events
   * 
   * @param {Button} btn 
   */

/**
   * init import wizard
   */

/**
   * init month view
   */

/**
   * init phone grid panel hook if Phone app is available
   */

/**
   * init template
   * @private
   */

/**
   * init this component
   */

/**
   * init this view
   */

/**
   * initialises filter toolbar
   *  @private
   */

/**
   * inits all tempaltes of this view
   */

/**
   * inits this component
   */

/**
   * inits time scale
   * @private
   */

/**
   * is called after all subpanels have been loaded
   */

/**
   * is called on action cut
   * 
   * @param {} action
   * @param {} event
   */

/**
   * is called on action paste
   * 
   * @param {Date} datetime
   */

/**
   * is called on cancelling cut & paste
   */

/**
   * is called on scroll of a grid, scrolls the other grids
   * 
   * @param {Object} activeView
   * @param {Object} e Event
   */

/**
   * is called, when list is initialized, appends a date-paging-toolbar instead a normal one
   */

/**
   * is this event a recuring base event?
   *
   * @return {Boolean}
   */

/**
   * is this event a recuring exception?
   *
   * @return {Boolean}
   */

/**
   * is this event an recuring event instance?
   *
   * @return {Boolean}
   */

/**
   * just needed when inserted in an eventpickercombobox
   */

/**
   * layouts a single day cell
   * 
   * @param {dom} cell
   * @param {Bool} hideOverflow
   * @param {Bool} updateHeader
   */

/**
   * layouts the contents (sets 'more items marker')
   */

/**
   * layouts the view
   */

/**
   * linkify text
   *
   * @param {String} text
   * @param {Ext.Element|Function} cb
   */

/**
   * load perspective into dialog
   */

/**
   * loads this panel with data from given record
   * called by edit dialog when record is loaded
   * 
   * @param {Tine.Calendar.Model.Event} record
   * @param Array addAttendee
   */

/**
   * main event details panel
   * 
   * @return {Ext.ux.display.DisplayPanel}
   */

/**
   * markdown renderer - fulltext, special type
   * @param {String} v The string to format.
   * @param {Object} metaData Grid metadata object
   * @param {Object} record Grid record
   * @return {String} The formatted string.
   */

/**
   * mute first alert
   * 
   * @param {} button
   * @param {} e
   */

/**
   * need this, because we use setValue from Tine.Tinebase.widgets.form.RecordPickerComboBox
   */

/**
   * on dt start change
   * 
   * @param {} dtStartField
   * @param {} newValue
   * @param {} oldValue
   */

/**
   * on store load exception
   * 
   * @param {Tine.Tinebase.data.RecordProxy} proxy
   * @param {String} type
   * @param {Object} error
   * @param {Object} options
   */

/**
   * onContextMenu
   * 
   * @param {Event} e
   */

/**
   * open event in new window
   * 
   * @param {String} action  add|edit|copy
   * @param {String} event   edit given event instead of selected event
   * @param {Object} plugins event dlg plugins
   * @param {Object} default properties for new items
   */

/**
   * perform the initial load of grid data
   */

/**
   * period NOTE: might not fit to current range on view changes!
   */

/**
   * preform the initial load of grid data
   */

/**
   * prepare paging and sort
   *
   * @param {Ext.data.Store} store
   * @param {Object} options
   */

/**
   * prevent menu hide
   */

/**
   * print wrapper
   */

/**
   * process IMIP
   *
   * @param {String} status
   */

/**
   * provide events to do an freeBusy info checkup for when searching attendee
   *
   * @cfg {Function} freeBusyEventsProvider
   */

/**
   * record class
   * @cfg {Tine.Addressbook.Model.Contact} recordClass
   */

/**
   * record currently being edited or false
   * @property {Record} editing
   * @private
   */

/**
   * register event
   * @param {Ext.data.Record} event
   * @param {bool} returnAffected
   * @return mixed
   */

/**
   * registers evnet in given frame for given slice
   * 
   * @private
   * @param {Array} frame
   * @param {Number} startIdx
   * @param {Number} endIdx
   * @param {Ext.data.Record} event
   * @return this
   */

/**
   * registers evnet in given frame for given slice 
   * 
   * @private
   * @param {Array} frame
   * @param {Number} startIdx
   * @param {Number} endIdx
   * @return this
   */

/**
   * reload client
   *
   * @param {Object} options
   *      {Boolean} keepRegistry
   *      {Boolean} clearCache
   *      {Boolean} redirectAlways
   *      {String} redirectUrl
   */

/**
   * remove all events from dom
   */

/**
   * removes a event from the dom
   * @param {Tine.Calendar.Model.Event} event
   */

/**
   * removes a event from the dom
   */

/**
   * removes all events from dom
   */

/**
   * removes all events from store
   */

/**
   * render attender user name
   *
   * @param name
   * @returns {*}
   */

/**
   * render single tag
   *
   * @param {Tine.Tinebase.Model.Tag} tag
   */

/**
   * renders a single event into this daysview
   * @param {Tine.Calendar.Model.Event} event
   * 
   * @todo Add support vor Events spanning over a day boundary
   */

/**
   * renders attendee names
   * 
   * @param {Array} attendeeData
   * @return {String}
   */

/**
   * renders bytes for filesize
   * @param {Integer} value
   * @param {Object} metadata
   * @param {Tine.Tinebase.data.Record} record
   * @param {Integer} decimals
   * @param {Boolean} useDecimalValues
   * @return {String}
   */

/**
   * renders datetime
   * 
   * @param {Date} dt
   * @return {String}
   */

/**
   * renders the view
   */

/**
   * respect record.getTitle method
   */

/**
   * return yes or no in the selected language for a boolean value
   *
   * @param {string} value
   * @return {string}
   */

/**
   * returns HTML fragment of the whole day cols
   */

/**
   * returns HTML frament of the day headers
   */

/**
   * returns account_id if attender is/has a user account
   *
   * @return {String}
   */

/**
   * returns all filter data for current view
   */

/**
   * returns attender record of current account if exists, else false
   */

/**
   * returns cm
   * 
   * @return Ext.grid.ColumnModel
   * @private
   */

/**
   * returns dialog
   * 
   * NOTE: when this method gets called, all initalisation is done.
   * @return {Object} components this.itmes definition
   */

/**
   * returns displaycontainer with orignialcontainer as fallback
   *
   * @return {Array}
   */

/**
   * returns events dom
   * @return {Array} of Ext.Element
   */

/**
   * returns events of current range sorted by duration
   * 
   * @param  {Date} dtStart
   * @param  {Date} dtEnd
   * @return {Array}
   */

/**
   * returns extracted, type-cast rows of data.  Iterates to call #extractValues for each row
   * @param {Object[]/Object} data-root from server response
   * @param {Boolean} returnRecords [false] Set true to return instances of Ext.data.Record
   * @private
   */

/**
   * returns filter toolbar of mainscreen center panel of app this picker panel belongs to
   */

/**
   * returns frame of given position. 
   * If no frame is found on given position it will be created implicitlty
   * 
   * @private
   * @param {Number} position
   * @return {Array}
   */

/**
   * returns iconCls of this application
   *
   * @param {String} target
   * @return {String}
   */

/**
   * returns id of attender of any kind
   */

/**
   * returns index of dateCell given date is in
   * @param {Date} date
   */

/**
   * returns period of currently displayed month
   * @return {Object}
   */

/**
   * returns random integer number
   * @param {Integer} min
   * @param {Integer} max
   * @return {Integer}
   */

/**
   * returns requested CalendarPanel
   * 
   * @param {String} which
   * @return {Tine.Calendar.CalendarPanel}
   */

/**
   * returns requested period
   * @return {Array}
   */

/**
   * returns store of attender objects
   *
   * @param  {Array} attendeeData
   * @return {Ext.data.Store}
   */

/**
   * returns store of currently active view
   */

/**
   * returns the file panel of this wizard (step 1)
   */

/**
   * returns the id of the record
   */

/**
   * returns the paste action
   * 
   * @param {Date} datetime
   * @param {Tine.Calendar.Model.Event} event
   */

/**
   * returns the php class name of the record itself or by the application(name) and model(name)
   * @param {mixed} app       the application instance or the application name or the record class
   * @param {mixed} model     the model name
   * @return {String} php class name
   */

/**
   * returns the selectionModel of the active panel
   * @return {}
   */

/**
   * returns title of this record
   * 
   * @return {String}
   */

/**
   * returns true for external contacts
   */

/**
   * returns true if given record obsoletes this one
   * 
   * - returns false if record has no modlog properties to make 
   *   handling of updated records work in the grid panel
   * @see 0009464: user grid does not refresh after ctx menu action
   * 
   * @param {Record} record
   * @return {Boolean}
   */

/**
   * set attendee value
   * 
   * @param {Array} value
   */

/**
   * set filter value (done by MainScreenCenterPanel::onStoreLoad)
   * 
   * @param {Array} filter
   */

/**
   * sets period ans searchword as query parameter
   * @param {} store
   */

/**
   * sets the id of the record
   *
   * @param {String} id
   */

/**
   * sets the id of the record
   */

/**
   * sets values to innerForm
   */

/**
   * show extra window & prevent autosave
   */

/**
   * show/layout iMIP panel
   */

/**
   * shows an reload button in the datepager
   */

/**
   * shows an today button in the datepager
   */

/**
   * shows if the periodpicker is active
   * @type boolean
   */

/**
   * simple html to text conversion
   *
   * @param html
   * @returns {String}
   */

/**
   * sorts account/user objects
   *
   * @param {Object|String} user_id
   * @return {String}
   */

/**
   * sorts records
   *
   * @param {Object} record
   * @return {String}
   */

/**
   * store holding timescale
   * @property {Ext.data.Store}
   * @private
   */

/**
   * store to hold all attendee
   * 
   * @type Ext.data.Store
   * @property attendeeStore
   */

/**
   * sync to filter panel
   */

/**
   * template fn called when record is instanciated
   */

/**
   * the event edit dialog (parent)
   * @type Tine.Calendar.EventEditDialog
   */

/**
   * toJson
   * @return {String}
   */

/**
   * type-casts a single row of raw-data from server
   * @param {Object} data
   * @param {Array} items
   * @param {Integer} len
   * @private
   */

/**
   * unregister event
   * 
   * @param {Ext.data.Record} event
   */

/**
   * update complete record with data from given record
   *
   * @param record
   */

/**
   * update event details panel
   * 
   * @param {Tine.Tinebase.data.Record} record
   * @param {Mixed} body
   */

/**
   * update perspective from dialog
   */

/**
   * updates HTML of day headers
   */

/**
   * updates a recuring event series
   * 
   * @param {Tine.Calendar.Model.Event} event
   * @param {Object} options
   * @return {String} transaction id
   */

/**
   * updates period to display
   * @param {Array} period
   */

/**
   * value renderer
   * 
   * @param {Ext.data.Record} filter line
   * @param {Ext.Element} element to render to 
   */

/**
  * Creates a callback that passes arguments[0], arguments[1], arguments[2], ...
  * Call directly on any function. Example: <code>myFunction.createCallback(arg1, arg2)</code>
  * Will create a function that is bound to those 2 args. <b>If a specific scope is required in the
  * callback, use {@link #createDelegate} instead.</b> The function returned by createCallback always
  * executes in the window scope.
  * <p>This method is required when you want to pass arguments to a callback function.  If no arguments
  * are needed, you can simply pass a reference to the function as a callback (e.g., callback: myFn).
  * However, if you tried to pass a function with arguments (e.g., callback: myFn(arg1, arg2)) the function
  * would simply execute immediately when the code is parsed. Example usage:
  * <pre><code>
  var sayHi = function(name){
  alert('Hi, ' + name);
  }
  // clicking the button alerts "Hi, Fred"
  new Ext.Button({
  text: 'Say Hi',
  renderTo: Ext.getBody(),
  handler: sayHi.createCallback('Fred')
  });
  </code></pre>
  * @return {Function} The new function
  */

/**
  * Creates an interceptor function. The passed function is called before the original one. If it returns false,
  * the original one is not called. The resulting function returns the results of the original function.
  * The passed function is called with the parameters of the original function. Example usage:
  * <pre><code>
  var sayHi = function(name){
  alert('Hi, ' + name);
  }
  sayHi('Fred'); // alerts "Hi, Fred"
  // create a new function that validates input without
  // directly modifying the original function:
  var sayHiToFriend = sayHi.createInterceptor(function(name){
  return name == 'Brian';
  });
  sayHiToFriend('Fred');  // no alert
  sayHiToFriend('Brian'); // alerts "Hi, Brian"
  </code></pre>
  * @param {Function} fcn The function to call before the original
  * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
  * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
  * @return {Function} The new function
  */

/**
 *
 * @param freeBusyInfo
 * @constructor
 */

/**
 * @TODO ui for active view?
 * @TODO we could also create views beforeload for better performace
 * 
 */

/**
 * @class   Tine.Calendar.Printer.BaseRenderer
 * @extends Ext.ux.Printer.BaseRenderer
 * 
 * Printig renderer for Ext.ux.printing
 */

/**
 * @class Array
 */

/**
 * @class Attendee
 * @extends Record
 * Attender Record Definition
 */

/**
 * @class DataReader.Error
 * @extends Ext.Error
 * General error class for DataReader
 */

/**
 * @class Event
 * @extends Record
 * Event record definition
 */

/**
 * @class Ext
 * Ext core utilities and functions.
 * @singleton
 */

/**
 * @class Ext
 */

/**
 * @class Ext.Error
 * @extends Error
 * <p>A base error class. Future implementations are intended to provide more
 * robust error handling throughout the framework (<b>in the debug build only</b>)
 * to check for common errors and problems. The messages issued by this class
 * will aid error checking. Error checks will be automatically removed in the
 * production build so that performance is not negatively impacted.</p>
 * <p>Some sample messages currently implemented:</p><pre>
"DataProxy attempted to execute an API-action but found an undefined
url / function. Please review your Proxy url/api-configuration."
 * </pre><pre>
"Could not locate your "root" property in your server response.
Please review your JsonReader config to ensure the config-property
"root" matches the property your server-response.  See the JsonReader
docs for additional assistance."
 * </pre>
 * <p>An example of the code used for generating error messages:</p><pre><code>
try {
    generateError({
        foo: 'bar'
    });
}
catch (e) {
    console.error(e);
}
function generateError(data) {
    throw new Ext.Error('foo-error', data);
}
 * </code></pre>
 * @param {String} message
 */

/**
 * @class Ext.data.Response
 * A generic response class to normalize response-handling internally to the framework.
 */

/**
 * @class Ext.data.SortTypes
 * @singleton
 * Defines the default sorting (casting?) comparison functions used when sorting data.
 */

/**
 * @class Function
 * These functions are available on every Function object (any JavaScript function).
 */

/**
 * @class JsonReader.Error
 * Error class for JsonReader
 */

/**
 * @class Number
 */

/**
 * @class String
 * These functions are available as static methods on the JavaScript String object.
 */

/**
 * @class String
 * These functions are available on every String object.
 */

/**
 * @class Tine.Calendar.CalendarPanel
 * @namespace Tine.Calendar
 * @extends Ext.Panel
 * @author Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @class Tine.Calendar.EventDetailsPanel
 * @namespace Tine.Calendar
 * @extends Tine.widgets.grid.DetailsPanel
 * @author Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @class Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @extends Ext.util.Observable
 * @constructor
 * @param {Object} config
 */

/**
 * @class Tine.Calendar.PagingToolbar.CustomPeriodPicker
 * @extends Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @constructor
 */

/**
 * @class Tine.Calendar.PagingToolbar.DayPeriodPicker
 * @extends Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @constructor
 */

/**
 * @class Tine.Calendar.PagingToolbar.MonthPeriodPicker
 * @extends Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @constructor
 */

/**
 * @class Tine.Calendar.PagingToolbar.WeekPeriodPicker
 * @extends Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @constructor
 */

/**
 * @class Tine.Calendar.PagingToolbar.YearPeriodPicker
 * @extends Tine.Calendar.PagingToolbar.AbstractPeriodPicker
 * @constructor
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AbstractView
 * @extends     Ext.Container
 *
 * Calendar abstract view
 *
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AddToEventPanel
 * @extends     Tine.widgets.dialog.AddToRecordPanel
 * @author      Alexander Stintzing <alex@stintzing.net>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AddressbookGridPanelHook
 * 
 * <p>Calendar Addressbook Hook</p>
 * <p>
 * </p>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * 
 * @constructor
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.Application
 * @extends     Tine.Tinebase.Application
 * Calendar Application Object <br>
 *
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeeCombo
 * @extends     Ext.form.ComboBox
 * @author      Ching En Cheng <c.cheng@metaways.de>
 *
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeeFilterModel
 * @extends     Tine.widgets.grid.FilterModel
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeeFilterModelValueField
 * @extends     Ext.ux.form.LayerCombo
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeeGridPanel
 * @extends     Ext.grid.EditorGridPanel
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeePickerCombo
 * @extends     Tine.Tinebase.widgets.form.RecordPickerComboBox
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.DaysView
 * @extends     Tine.Calendar.AbstractView
 * Calendar view representing each day in a column
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.ExceptionHandler
 * 
 * <p>Exception Handler for Calendar</p>
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <a.stintzing@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.FilterPanel
 * @extends     Tine.widgets.persistentfilter.PickerPanel
 * 
 * <p>Calendar Favorites Panel</p>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * 
 * @param       {Object} config
 * @constructor
 * Create a new Tine.Calendar.FilterPanel
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.GridView
 * @extends     Ext.grid.GridPanel
 * 
 * Calendar grid view representing
 * 
 * @TODO generalize renderers and role out to displaypanel/printing etc.
 * @TODO add organiser and own status
 * 
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.PerspectiveCombo
 * @extends     Ext.form.ComboBox
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * 
 * @TODO make displaycontainer setting work
 * todo: extend AttendeeCombo?
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.ResourcePickerCombo
 * @extends     Tine.Tinebase.widgets.form.RecordPickerComboBox
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.RruleFilter
 * @extends     Tine.widgets.grid.FilterModel
 *
 * @author      Michael Spahn <m.spahn@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.RruleFilterValueField
 * @extends     Ext.ux.form.LayerCombo
 *
 * @author      Michael Spahn <m.spahn@metaways.de>
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.TimelineLabel
 * @extends     Ext.Component
 *
 * Calendar timeline view
 *
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.TimelinePanel
 * @extends     Ext.Panel
 *
 * Calendar timeline view
 *
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.TimelineView
 * @extends     Tine.Calendar.AbstractView
 *
 * Calendar timeline view
 *
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace   Tine.Calendar.
 * @class       Tine.Calendar.TagFilter
 * @extends     Tine.widgets.grid.FilterModel
 */

/**
 * @namespace   Tine.Calendar.Model
 * @class       Tine.Calendar.Model.ResourceType
 * @extends     Tine.Tinebase.data.Record
 * ResourceType Record Definition
 */

/**
 * @namespace   Tine.Calendar.Model
 * @class       Tine.Calendar.Model.iMIP
 * @extends     Tine.Tinebase.data.Record
 * iMIP Record Definition
 */

/**
 * @namespace Tine.Calendar
 * @class     Tine.Calendar.CalendarSelectTreePanel
 * @extends   Tine.widgets.container.TreePanel
 * 
 * Main Calendar Select Panel
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/**
 * @namespace Tine.Calendar
 * @class     Tine.Calendar.ResourceEditDialog
 * @extends   Tine.widgets.dialog.EditDialog
 * Resources Grid Panel <br>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace Tine.Calendar
 * @class     Tine.Calendar.ResourceGridPanel
 * @extends   Tine.widgets.grid.GridPanel
 * Resources Grid Panel <br>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.ColorManager
 * Colormanager for Coloring Calendar Events <br>
 * 
 * @constructor
 * Creates a new color manager
 * @param {Object} config
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.EventEditDialog
 * @extends Tine.widgets.dialog.EditDialog
 * Calendar Edit Dialog <br>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.EventSelectionModel
 * @extends Ext.tree.MultiSelectionModel
 * Selection model for a calendar views.
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.FreeTimeSearchDialog
 * @extends Ext.Panel
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.MainScreen
 * @extends Tine.widgets.MainScreen
 * MainScreen of the Calendar Application <br>
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 * @constructor
 * Constructs mainscreen of the calendar application
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.MonthView
 * @extends Ext.util.Observable
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.ViewInCalendarDialog
 * @extends Ext.Panel
 */

/**
 * @namespace Tine.Calendar
 * @class Tine.Calendar.YearView
 * @extends Ext.util.Observable
 * @constructor
 * @param {Object} config
 */

/**
 * @namespace Tine.Calendar.Model
 *
 * creates store of attender objects
 *
 * @param  {Array} attendeeData
 * @return {Ext.data.Store}
 * @static
 */

/**
 * @namespace Tine.Calendar.Model
 *
 * get default data for a new attender
 *
 * @return {Object} default data
 * @static
 */

/**
 * @namespace Tine.Calendar.Model
 *
 * get default data for a new resource
 *
 * @return {Object} default data
 * @static
 */

/**
 * @namespace Tine.Calendar.Model
 * @class Resource
 * @extends Record
 * Resource Record Definition
 */

/**
 * @namespace Tine.Calendar.Model
 * @class Tine.Calendar.Model.EventJsonBackend
 * @extends Tine.Tinebase.data.RecordProxy
 * 
 * JSON backend for events
 */

/**
 * @namespace Tine.Tinebase.data
 * @class     Record
 * @extends   Ext.data.Record
 * 
 * Baseclass of Tine 2.0 models
 */

/**
 * @type {Array}
 *
 * modlog Fields
 */

/**
 * @type {Array}
 * generic Record fields
 */

/**
 * A specialized version of `_.filter` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 */

/**
 * A specialized version of `_.forEach` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns `array`.
 */

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */

/**
 * Appends an event handler to this object (shorthand for {@link #addListener}.)
 * @param {String}   eventName     The type of event to listen for
 * @param {Function} handler       The method the event invokes
 * @param {Object}   scope         (optional) The scope (<code><b>this</b></code> reference) in which the handler function is executed.
 * <b>If omitted, defaults to the object which fired the event.</b>
 * @param {Object}   options       (optional) An object containing handler configuration.
 * @method
 */

/**
 * Appends the elements of `values` to `array`.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {Array} values The values to append.
 * @returns {Array} Returns `array`.
 */

/**
 * Assigns `value` to `key` of `object` if the existing value is not equivalent
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */

/**
 * Calendar Admin Panel Popup
 * 
 * @param   {Object} config
 * @return  {Ext.ux.Window}
 */

/**
 * Calendar west panel
 * 
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.WestPanel
 * @extends     Tine.widgets.mainscreen.WestPanel
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * 
 * @constructor
 * @xtype       tine.calendar.mainscreenwestpanel
 */

/**
 * Checks if `func` has its source masked.
 *
 * @private
 * @param {Function} func The function to check.
 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
 */

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */

/**
 * Checks if `value` is suitable for use as unique object key.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
 */

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */

/**
 * Checks if a hash value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Hash
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */

/**
 * Checks if a list cache value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf ListCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */

/**
 * Checks if a map value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf MapCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */

/**
 * Checks if a stack value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Stack
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */

/**
 * Color Strategies Registry
 * 
 * @type Object
 */

/**
 * Converts `func` to its source code.
 *
 * @private
 * @param {Function} func The function to convert.
 * @returns {string} Returns the source code.
 */

/**
 * Converts `value` to a string using `Object.prototype.toString`.
 *
 * @private
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 */

/**
 * Copies all the properties of config to obj.
 * @param {Object} obj The receiver of the properties
 * @param {Object} config The source of the properties
 * @param {Object} defaults A different object that will also be applied for default values
 * @return {Object} returns obj
 * @member Ext apply
 */

/**
 * Copies own and inherited symbols of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy symbols from.
 * @param {Object} [object={}] The object to copy symbols to.
 * @returns {Object} Returns `object`.
 */

/**
 * Copies own symbols of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy symbols from.
 * @param {Object} [object={}] The object to copy symbols to.
 * @returns {Object} Returns `object`.
 */

/**
 * Copies properties of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy properties from.
 * @param {Array} props The property identifiers to copy.
 * @param {Object} [object={}] The object to copy properties to.
 * @param {Function} [customizer] The function to customize copied values.
 * @returns {Object} Returns `object`.
 */

/**
 * Copies the values of `source` to `array`.
 *
 * @private
 * @param {Array} source The array to copy values from.
 * @param {Array} [array=[]] The array to copy values to.
 * @returns {Array} Returns `array`.
 */

/**
 * Create new EventFinderOptionsDialog window
 */

/**
 * Create new import window
 */

/**
 * Creates a clone of  `buffer`.
 *
 * @private
 * @param {Buffer} buffer The buffer to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Buffer} Returns the cloned buffer.
 */

/**
 * Creates a clone of `arrayBuffer`.
 *
 * @private
 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
 * @returns {ArrayBuffer} Returns the cloned array buffer.
 */

/**
 * Creates a clone of `dataView`.
 *
 * @private
 * @param {Object} dataView The data view to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the cloned data view.
 */

/**
 * Creates a clone of `regexp`.
 *
 * @private
 * @param {Object} regexp The regexp to clone.
 * @returns {Object} Returns the cloned regexp.
 */

/**
 * Creates a clone of `typedArray`.
 *
 * @private
 * @param {Object} typedArray The typed array to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the cloned typed array.
 */

/**
 * Creates a clone of the `symbol` object.
 *
 * @private
 * @param {Object} symbol The symbol object to clone.
 * @returns {Object} Returns the cloned symbol object.
 */

/**
 * Creates a hash object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */

/**
 * Creates a map cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */

/**
 * Creates a stack cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */

/**
 * Creates an array of own and inherited enumerable property names and
 * symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names and symbols.
 */

/**
 * Creates an array of own enumerable property names and symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names and symbols.
 */

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */

/**
 * Creates an array of the own and inherited enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keysIn(new Foo);
 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
 */

/**
 * Creates an array of the own enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects. See the
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * for more details.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keys(new Foo);
 * // => ['a', 'b'] (iteration order is not guaranteed)
 *
 * _.keys('hi');
 * // => ['0', '1']
 */

/**
 * Creates an list cache object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */

/**
 * File picker dialog
 *
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.EventFinderOptionsDialog
 * @extends     Ext.FormPanel
 * @constructor
 * @param       {Object} config The configuration options.
 */

/**
 * Generate a constructor for a specific Record layout.
 * 
 * @param {Array} def see {@link Ext.data.Record#create}
 * @param {Object} meta information see {@link Record}
 * 
 * <br>usage:<br>
<b>IMPORTANT: the ngettext comments are required for the translation system!</b>
<pre><code>
var TopicRecord = Record.create([
    {name: 'summary', mapping: 'topic_title'},
    {name: 'details', mapping: 'username'}
], {
    appName: 'Tasks',
    modelName: 'Task',
    idProperty: 'id',
    titleProperty: 'summary',
    // ngettext('Task', 'Tasks', n);
    recordName: 'Task',
    recordsName: 'Tasks',
    containerProperty: 'container_id',
    // ngettext('to do list', 'to do lists', n);
    containerName: 'to do list',
    containesrName: 'to do lists'
});
</code></pre>
 * @static
 */

/**
 * Generate a constructor for a specific Record layout.
 * @param {Array} o An Array of <b>{@link Ext.data.Field Field}</b> definition objects.
 * The constructor generated by this method may be used to create new Record instances. The data
 * object must contain properties named after the {@link Ext.data.Field field}
 * <b><tt>{@link Ext.data.Field#name}s</tt></b>.  Example usage:<pre><code>
// create a Record constructor from a description of the fields
var TopicRecord = Record.create([ // creates a subclass of Record
    {{@link Ext.data.Field#name name}: 'title', {@link Ext.data.Field#mapping mapping}: 'topic_title'},
    {name: 'author', mapping: 'username', allowBlank: false},
    {name: 'totalPosts', mapping: 'topic_replies', type: 'int'},
    {name: 'lastPost', mapping: 'post_time', type: 'date'},
    {name: 'lastPoster', mapping: 'user2'},
    {name: 'excerpt', mapping: 'post_text', allowBlank: false},
    // In the simplest case, if no properties other than <tt>name</tt> are required,
    // a field definition may consist of just a String for the field name.
    'signature'
]);

// create Record instance
var myNewRecord = new TopicRecord(
    {
        title: 'Do my job please',
        author: 'noobie',
        totalPosts: 1,
        lastPost: new Date(),
        lastPoster: 'Animal',
        excerpt: 'No way dude!',
        signature: ''
    },
    id // optionally specify the id of the record otherwise {@link #Record.id one is auto-assigned}
);
myStore.{@link Ext.data.Store#add add}(myNewRecord);
</code></pre>
 * @method create
 * @return {function} A constructor which is used to create new Records according
 * to the definition. The constructor has the same signature as {@link #Record}.
 * @static
 */

/**
 * Generates a sequential id. This method is typically called when a record is {@link #create}d
 * and {@link #Record no id has been specified}. The returned id takes the form:
 * <tt>&#123;PREFIX}-&#123;AUTO_ID}</tt>.<div class="mdetail-params"><ul>
 * <li><b><tt>PREFIX</tt></b> : String<p class="sub-desc"><tt>Record.PREFIX</tt>
 * (defaults to <tt>'ext-record'</tt>)</p></li>
 * <li><b><tt>AUTO_ID</tt></b> : String<p class="sub-desc"><tt>Record.AUTO_ID</tt>
 * (defaults to <tt>1</tt> initially)</p></li>
 * </ul></div>
 * @param {Record} rec The record being created.  The record does not exist, it's a {@link #phantom}.
 * @return {String} auto-generated string id, <tt>"ext-record-i++'</tt>;
 */

/**
 * Gets the data for `map`.
 *
 * @private
 * @param {Object} map The map to query.
 * @param {string} key The reference key.
 * @returns {*} Returns the map data.
 */

/**
 * Gets the hash value for `key`.
 *
 * @private
 * @name get
 * @memberOf Hash
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */

/**
 * Gets the index at which the `key` is found in `array` of key-value pairs.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} key The key to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */

/**
 * Gets the list cache value for `key`.
 *
 * @private
 * @name get
 * @memberOf ListCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */

/**
 * Gets the map value for `key`.
 *
 * @private
 * @name get
 * @memberOf MapCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */

/**
 * Gets the native function at `key` of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the method to get.
 * @returns {*} Returns the function if it's native, else `undefined`.
 */

/**
 * Gets the stack value for `key`.
 *
 * @private
 * @name get
 * @memberOf Stack
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */

/**
 * Gets the value at `key` of `object`.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */

/**
 * Info Color Bar Strategies Registry
 *
 * @type Object
 */

/**
 * Initializes an array clone.
 *
 * @private
 * @param {Array} array The array to clone.
 * @returns {Array} Returns the initialized clone.
 */

/**
 * Initializes an object clone based on its `toStringTag`.
 *
 * **Note:** This function only supports cloning values with tags of
 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
 *
 * @private
 * @param {Object} object The object to clone.
 * @param {string} tag The `toStringTag` of the object to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the initialized clone.
 */

/**
 * Initializes an object clone.
 *
 * @private
 * @param {Object} object The object to clone.
 * @returns {Object} Returns the initialized clone.
 */

/**
 * Model of a grant
 */

/**
 * Namespace alloted for extensions to the framework.
 * @property ux
 * @type Object
 */

/**
 * Opens a new event edit dialog window
 * 
 * @return {Ext.ux.Window}
 */

/**
 * Opens a new free time serach dialog window
 *
 * @return {Ext.ux.Window}
 */

/**
 * Opens a new resource edit dialog window
 * 
 * @return {Ext.ux.Window}
 */

/**
 * Performs a
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * comparison between two values to determine if they are equivalent.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.eq(object, object);
 * // => true
 *
 * _.eq(object, other);
 * // => false
 *
 * _.eq('a', 'a');
 * // => true
 *
 * _.eq('a', Object('a'));
 * // => false
 *
 * _.eq(NaN, NaN);
 * // => true
 */

/**
 * Removes <b>all</b> added captures from the Observable.
 * @param {Observable} o The Observable to release
 * @static
 */

/**
 * Removes `key` and its value from the hash.
 *
 * @private
 * @name delete
 * @memberOf Hash
 * @param {Object} hash The hash to modify.
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */

/**
 * Removes `key` and its value from the list cache.
 *
 * @private
 * @name delete
 * @memberOf ListCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */

/**
 * Removes `key` and its value from the map.
 *
 * @private
 * @name delete
 * @memberOf MapCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */

/**
 * Removes `key` and its value from the stack.
 *
 * @private
 * @name delete
 * @memberOf Stack
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */

/**
 * Removes all key-value entries from the hash.
 *
 * @private
 * @name clear
 * @memberOf Hash
 */

/**
 * Removes all key-value entries from the list cache.
 *
 * @private
 * @name clear
 * @memberOf ListCache
 */

/**
 * Removes all key-value entries from the map.
 *
 * @private
 * @name clear
 * @memberOf MapCache
 */

/**
 * Removes all key-value entries from the stack.
 *
 * @private
 * @name clear
 * @memberOf Stack
 */

/**
 * Removes an event handler (shorthand for {@link #removeListener}.)
 * @param {String}   eventName     The type of event the handler was associated with.
 * @param {Function} handler       The handler to remove. <b>This must be a reference to the function passed into the {@link #addListener} call.</b>
 * @param {Object}   scope         (optional) The scope originally specified for the handler.
 * @method
 */

/**
 * Sets the hash `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Hash
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the hash instance.
 */

/**
 * Sets the list cache `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf ListCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the list cache instance.
 */

/**
 * Sets the map `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf MapCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the map cache instance.
 */

/**
 * Sets the stack `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Stack
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the stack cache instance.
 */

/**
 * Simple Import Dialog
 *
 * @namespace   Tine.widgets.dialog
 * @class       Tine.widgets.dialog.ImportDialog
 * @extends     Tine.widgets.dialog.EditDialog
 * @constructor
 * @param       {Object} config The configuration options.
 * 
 * TODO add app grid to show results when dry run is selected
 */

/**
 * The base implementation of `_.assignIn` without support for multiple sources
 * or `customizer` functions.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @returns {Object} Returns `object`.
 */

/**
 * The base implementation of `_.assign` without support for multiple sources
 * or `customizer` functions.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @returns {Object} Returns `object`.
 */

/**
 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
 * traversed objects.
 *
 * @private
 * @param {*} value The value to clone.
 * @param {boolean} bitmask The bitmask flags.
 *  1 - Deep clone
 *  2 - Flatten inherited properties
 *  4 - Clone symbols
 * @param {Function} [customizer] The function to customize cloning.
 * @param {string} [key] The key of `value`.
 * @param {Object} [object] The parent object of `value`.
 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
 * @returns {*} Returns the cloned value.
 */

/**
 * The base implementation of `_.isArguments`.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 */

/**
 * The base implementation of `_.isMap` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
 */

/**
 * The base implementation of `_.isNative` without bad shim checks.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a native function,
 *  else `false`.
 */

/**
 * The base implementation of `_.isSet` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
 */

/**
 * The base implementation of `_.isTypedArray` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 */

/**
 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */

/**
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */

/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */

/**
 * The base implementation of `_.unary` without support for storing metadata.
 *
 * @private
 * @param {Function} func The function to cap arguments for.
 * @returns {Function} Returns the new capped function.
 */

/**
 * The base implementation of `assignValue` and `assignMergeValue` without
 * value checks.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */

/**
 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
 * symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @param {Function} symbolsFunc The function to get the symbols of `object`.
 * @returns {Array} Returns the array of property names and symbols.
 */

/**
 * The base implementation of `getTag` without fallbacks for buggy environments.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */

/**
 * This function is like
 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * except that it includes inherited enumerable properties.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */

/**
 * This method calls {@link #item item()}.
 * Returns the item associated with the passed key OR index. Key has priority
 * over index.  This is the equivalent of calling {@link #key} first, then if
 * nothing matched calling {@link #itemAt}.
 * @param {String/Number} key The key or index of the item.
 * @return {Object} If the item is found, returns the item.  If the item was
 * not found, returns <tt>undefined</tt>. If an item was found, but is a Class,
 * returns <tt>null</tt>.
 */

/**
 * This method is like `_.clone` except that it recursively clones `value`.
 *
 * @static
 * @memberOf _
 * @since 1.0.0
 * @category Lang
 * @param {*} value The value to recursively clone.
 * @returns {*} Returns the deep cloned value.
 * @see _.clone
 * @example
 *
 * var objects = [{ 'a': 1 }, { 'b': 2 }];
 *
 * var deep = _.cloneDeep(objects);
 * console.log(deep[0] === objects[0]);
 * // => false
 */

/**
 * This method returns `false`.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {boolean} Returns `false`.
 * @example
 *
 * _.times(2, _.stubFalse);
 * // => [false, false]
 */

/**
 * This method returns a new empty array.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {Array} Returns the new empty array.
 * @example
 *
 * var arrays = _.times(2, _.stubArray);
 *
 * console.log(arrays);
 * // => [[], []]
 *
 * console.log(arrays[0] === arrays[1]);
 * // => false
 */

/**
 * Trims whitespace from either end of a string, leaving spaces within the string intact.  Example:
 * <pre><code>
var s = '  foo bar  ';
alert('-' + s + '-');         //alerts "- foo bar -"
alert('-' + s.trim() + '-');  //alerts "-foo bar-"
</code></pre>
 * @return {String} The trimmed string
 */

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 */

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */

/**
 * Utility function that allows you to easily switch a string between two alternating values.  The passed value
 * is compared to the current string, and if they are equal, the other value that was passed in is returned.  If
 * they are already different, the first value passed in is returned.  Note that this method returns the new value
 * but does not change the current string.
 * <pre><code>
// alternate sort directions
sort = sort.toggle('ASC', 'DESC');

// instead of conditional logic:
sort = (sort == 'ASC' ? 'DESC' : 'ASC');
</code></pre>
 * @param {String} value The value to compare to the current string
 * @param {String} other The new value to use if the string already equals the first value passed in
 * @return {String} The new value
 */

/**
 * admin settings panel
 * 
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AdminPanel
 * @extends     Ext.TabPanel
 * 
 * <p>Calendar Admin Panel</p>
 * <p><pre>
 * </pre></p>
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Philipp Schuele <p.schuele@metaways.de>
 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
 * 
 * @param       {Object} config
 * @constructor
 * Create a new Tine.Calendar.AdminPanel
 */

/**
 * attendee filter gird widget
 * 
 * @TODO: remove attendee deleted on server?
 * 
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.AttendeeFilterGrid
 * @extends     Tine.Calendar.AttendeeGridPanel
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 */

/**
 * create record from json string
 *
 * @param {String} json
 * @param {Record} recordClass
 * @returns {Record}
 */

/**
 * display panel for MIME type text/calendar
 * 
 * NOTE: this panel is registered on Tine.Calendar::init
 * 
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.iMIPDetailsPanel
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @constructor
 */

/**
 * event selection combo box
 *
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.SearchCombo
 * @extends     Ext.form.ComboBox
 *
 * <p>Event Search Combobox</p>
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <alex@stintzing.net>
 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 * @param       {Object} config
 * @constructor
 * Create a new Tine.Calendar.SearchCombo
 *
 * @TODO        Extend Tine.Tinebase.widgets.form.RecordPickerComboBox once this class
 *              is rewritten to use beforeload/load events
 */

/**
 * get default data for a new event
 *
 * @return {Object} default data
 * @static
 */

/**
 * get default data for a new resource
 *
 * @return {Object} default data
 * @static
 */

/**
 * registry to cope with parallel events
 * 
 * @class Tine.Events.ParallelEventsRegistry
 * @constructor
 */

/**
 * render event container_id
 */

/**
 * render location relation
 *
 * @param data
 * @param cell
 * @param record
 * @returns {*|String}
 */

/**
 * render site relation
 *
 * @param data
 * @param cell
 * @param record
 * @returns {*|String}
 */

/**
 * render the CalDAV Url into property panel of containers
 * 
 * @class   Tine.Calendar.CalDAVContainerPropertiesHookField
 * @extends Tine.widgets.container.CalDAVContainerPropertiesHookField
 */

/**
 * returns a clone of given record (in current window context)
 *
 * @param {Record} record
 * @return {Record}
 */

/**
 * returns attendee data
 * optinally fills into event record
 */

/**
 * returns attendee record of given attendee if exists, else false
 * @static
 */

/**
 * returns attender record of current account if exists, else false
 * @static
 */

/**
 * returns cm
 *
 * @return Ext.grid.ColumnModel
 */

/**
 * returns the field
 *
 * @param {Object} fieldDefinition
 * @return {Object}
 */

/**
 * set current alternative as definite event
 */

/**
 * show all events, given contact record is attender of
 * 
 * NOTE: This Grid does not show recuings yet!
 *       If we want to display recurings we need to add a period filter.
 *       We might be able to do so after we have a generic calendar list widget
 *       with a generic period paging tbar
 *       
 * @namespace   Tine.Calendar
 * @class       Tine.Calendar.ContactEventsGridPanel
 * @extends     Tine.widgets.grid.GridPanel
 */

/**
 * type mapping
 * @type {Object}
 */

/**
 Returns the number of milliseconds between this date and date
 @param {Date} date (optional) Defaults to now
 @return {Number} The diff in milliseconds
 @member Date getElapsed
 */

/** Built-in value references. */

/** Detect free variable `exports`. */

/** Detect free variable `global` from Node.js. */

/** Detect free variable `self`. */

/** Used as references for various `Number` constants. */

/** Used as the size to enable large array optimizations. */

/** Used for built-in method references. */

/** Used to check objects for own properties. */

/** Used to compose bitmasks for cloning. */

/** Used to convert symbols to primitives and strings. */

/** Used to detect methods masquerading as native. */

/** Used to detect overreaching core-js shims. */

/** Used to detect unsigned integer values. */

/** Used to match `RegExp` flags from their coerced string values. */

/** Used to resolve the decompiled source of functions. */

/** Used to stand-in for `undefined` hash values. */

/** `Object#toString` result references. */

/** distinct click from dblClick **/

/** end distinct click from dblClick **/

/*************************************** frame functions **********************************/

/***/

/*, 'notin'*/

/*, {
             xtype: 'checkbox',
             fieldLabel: this.app.i18n._('Basic Data Only'),
             boxLabel: this.app.i18n._('Import only basic data (i.e., without attendees, alarms, UID, ...).'),
             name: 'onlyBasicData'
          }*/

/*.add(Date.SECOND, -1)*/

/*defaultOperator: 'in',*/

/*global Ext, Tine*/

/*global Ext, Tine, Locale*/

//

//    

//        

//            

//                             i have no idea why i commited here, maybe just because of the id?

//                             let's solve it better the next time!

//                attendeeFilter.formFields.operator.setValue('in');

//                html: '<p>' + this.app.i18n._('Below is a list of all supported import formats, along with a sample file showing how Tine 2.0 expects your file to be structured.') + '</p><br />'

//                return event.data.dtstart.getTime() < dayEnd.getTime() && event.data.dtend.getTime() > dayStart.getTime();

//                xtype: 'label',

//            // get events in this day

//            dayEnd   = dayStart.add(Date.DAY, 1).add(Date.SECOND, -1);

//            dayEvents = view.store.queryBy(function(event){

//            dayStart = view.startDate.add(Date.DAY, i);

//            days.push(this.generateDay(dayStart, dayEnd, dayEvents));

//            });

//            }, {

//         // but we would need to foreground the window and this is not possible for the browser

//         // save via mainscreen to show fbExceptions and recurring decistions

//        //    this.multiTpl.overwrite(body);

//        // iterate days

//        //if (this.multiTpl) {

//        //}

//        for (var dayStart, dayEnd, dayEvents, i=0; i<view.numOfDays; i++) {

//        return this.getSelectedEvents();

//        return view.numOfDays === 1 ? days[0] : String.format('<table>{0}</table>', this.generateCalRows(days, view.numOfDays < 9 ? 2 : 7));

//        this might be confusing in print

//        this.cardPanel.layout.setActiveItem(this.cardPanel.items.getKey(this.defaultPanel));

//        var body  = 

//        var days = [];

//        var topic = this.generateHeader(view);

//        }

//       -> use choose definite event

//       As ext has no suiteable layout for this, we do a little hack

//       WELL we could add the info to search attendee somehow

//       a problem here we have to find a smart solution

//       as the view just might be empty. If an unloded store is

//       for focus to work (e.g. iOS dosn't show keyborad)

//       so we can't set correct values in containing record here!

//       the buttons will be moved on chageView later

//     * 

//     * @param {Ext.grid.RowSelectionModel} sm

//     * @param {Mixed} body

//     * show default panel

//     * show template for multiple rows

//     */

//     .then(function() {

//     activePanel = cp.getCalendarPanel(cp.activeView),

//     activeView = activePanel.getView();

//     });

//    /**

//    // i18n._('Event attendee')

//    BUT startDate sticks to first of month!

//    filterName: 'ContactAttendeeFilter',

//    filtertype: 'foreignrecord',

//    foreignRecordClass: 'Calendar.Event',

//    generateBody: function(view) {

//    getSelections: function() {

//    label: 'Event attendee'

//    linkType: 'foreignId', 

//    showDefault: function(body) {

//    showMulti: function(sm, body) {

//    }

//    },

//  - sheetView begins with end of last month and ends with beginning of next month

//  - timelineView starts with the first and ends with the last

//  the check only sees [Object Object] wich of course never changes...

//  yes, this is a mem leak - but it's ok as recreate is a rare action

// #endif

// #extractData into DataReader base, since the implementations are almost identical for JsonReader, XmlReader

// #if process.env.NODE_ENV !== 'unittest'

// 'resourceExport', // should be resource-admin?

// 'resourceSync',   // no sync targets - let's save space

// - ...

// - if one attendee is busy

// - if organizer is busy

// - resources are busy

// -> applies to existing records (on server). we don't have a concept for new (phantom) records yet!

// -> otherwise loading spinner would be active event if the view beforeload cancels the request

// 00:00 in users timezone is a spechial case where the user expects

// 2025-01-15 - cweiss - NOTE: we can't commit here as we would loose __meta modified

// 30 minutes

// <- initialHeight

// <-- That's what it's all about

// <-- There's implementation of ugly bit, setting the raw record-data.

// <-- copy phantom-id -> _phid, so we can remap in Store#onCreateRecords

// <-- true to return [Ext.data.Record]

// @IDEA: this could be a combo later

// @TODO - have some fallback for old solution?

// @TODO check if event is visible and skip scrolling -> defered scrolling looks ugly

// @TODO compute max minutes also

// @TODO do this on period change only

// @TODO evaluate inputFilters. inputFilters run on server when the key ist set in the data whereas validators always run

// @TODO fixme, invent better handling to skip gdpr client plugin

// @TODO have load spinner?

// @TODO have some config here? user vs. default?

// @TODO implement clipbord field (trigger field)

// @TODO move to common function with daysView::notifyDrop parts

// @TODO print rrule

// @TODO sort out css

// @TODO timeline view

// @TODO: have own (grouping) ui

// @TODO: if week is not standard, have a marker in btn?

// @TODO: if you have a lot of allDayEvents, your scroller gets smaller,

// @TODO: use grants model and set all grants to true for new records

// @see http://www.stucox.com/blog/you-cant-detect-a-touchscreen/

// @see https://github.com/ericmorand/twing/issues/332

// @see https://github.com/tine20/tine20/issues/6236

// @see https://stackoverflow.com/questions/17989777/detect-if-ios-is-using-webapp/40932301#40932301

// @todo generalise!

// @todo how can we move that to the server?

// @todo move displaycal if curruser is attender

// @todo move this to dragOver

// A bit ugly this, too bad the Record's raw data couldn't be saved in a common property named "raw" or something.

// Add metadata section if we have status or recurrence info

// Add methods to `Hash`.

// Add methods to `ListCache`.

// Add methods to `MapCache`.

// Add methods to `Stack`.

// Add new attendee

// Add properties assigned by `RegExp#exec`.

// Append our div, do our calculation and then remove it

// BUT: add Grant is container based!

// Build main content

// CONCATENATED MODULE: ../../Calendar/js/SyncContainerConfigEditDialog.js

// CONCATENATED MODULE: ./CloudAccount/WebDAVCollectionPicker.js

// CONCATENATED MODULE: ./util/markdown.js

// CONCATENATED MODULE: ./ux/form/FieldTriggerPlugin.js

// Calendar is the only app with record based grants -> user gets edit grant for all fields when copying

// Calendar_Exception_InvalidUrl

// Check for circular references and return its corresponding clone.

// Check if this is the origin record

// Container already exists

// Create a container that will hold both the text and combo

// Create the combo (initially hidden)

// Create the static text display with hover functionality

// Determine suffix based on attendee role

// ESM COMPAT FLAG

// EXPORTS

// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js

// Exports

// Extract core data

// FIXME: how can this be null? is it ok??

// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.

// For old IE

// Get recurrence info

// Get status

// Had to add Check for XmlReader, #isData returns true if root is an Xml-object.  Want to check in order to re-factor

// IE returns elements with the 'name' and 'id' attribute.

// If rs is NOT an array but data IS, see if data contains just 1 record.  If so extract it and carry on.

// If url is already wrapped in quotes, remove them

// Iterate to stop any buffered/delayed events

// Legacy `process.binding('util')` for Node.js < 10.

// Module

// NOTE (from Ext docs): The default value used when a Record is being created by a Reader when the item referenced by the mapping does not exist in the data object (i.e. undefined). (defaults to "")

// NOTE: '+1' is to ensure we display the ISO8601 based week where weeks always start on monday!

// NOTE: Date.parseDate is an ext augmentation, should not be necessary for our ISO date format

// NOTE: Ext keeps proxy if element is not destroyed (diff !=0)

// NOTE: Server can't handle this properly, see {tine20/vendor/zendframework/zendframework1/library/Zend/Filter/Input.php:998}

// NOTE: already encoded

// NOTE: ext dosn't support move events via api

// NOTE: for transistent events id is not part of data but we need the transistent id e.g. for freeBusy info

// NOTE: gets overwritten with Record.getDefaultData (see below) for autogenerated models in appStarter

// NOTE: it's not possible to remove a persistent poll here

// NOTE: mind the add new attendee row!

// NOTE: monthView periods differ for views.

// NOTE: only mainscreen can handle busyConflicts

// NOTE: only render the button once for the toolbars

// NOTE: some browsers require user interaction (like click events)

// NOTE: store.getCount == 0 is no indicator for an unloaded store

// NOTE: the store checks if data changed. If we don't overwrite to string, 

// NOTE: the store somehow changes, so refetch it

// NOTE: this field default is meant for doctrine on server

// NOTE: this fn gets also called from other scopes

// NOTE: this is already done by the view itself - don't have dublicate events in mainscreen!

// NOTE: ui config overwrites db config

// NOTE: we can't compute if the user has editgrant to the displaycontainer of an account here!

// NOTE: we can't use a normal hbox layout as it can't deal with minWidth and overflow.

// NOTE: we can't use checked items here as we use icons already

// NOTE: we can't use export / import syntax as es6 modules require strict mode and this code can't cope with it

// NOTE: we don't iterate the attendeeStore as we would loose attendee order than

// NOTE: we need both setWidht statements, otherwise safari keeps scroller space

// NOTE: we need to dereference btn's in source view, oterwise btn's get destroyed on cmp destroy

// NOTE: we need to redraw event as resizer is broken after one attempt

// NOTE: we remove from items to avoid autoDestroy

// NOTE: when entering a plain mail, getValue is called (from onBlur or onSpecialkey) (no set value!!!)

// Need to add 2 to ensure we leave enough space

// Node.js 0.10 has enumerable non-index properties on buffers.

// Only show records with edit grant

// PROXY

// PhantomJS 2 has enumerable non-index properties on typed arrays.

// Recursively populate clone (susceptible to call stack limits).

// Safari 9 has enumerable `arguments.length` in strict mode.

// See https://drafts.csswg.org/css-values-3/#urls

// Set status if the resource has a specific default status

// Should url be wrapped?

// Skip index properties.

// Someone replied => autoprocessing atm.

// Special case to return head of iframe instead of iframe itself

// Start with unmodified Record

// TODO allow to copy recurring events / exceptions

// TODO return Ext.data.Response instance instead.  @see #readResponse

// TODO this is set to null somewhere in the Calendar, find a better place to fix this

// TODO: Let exception-handler choose to commit or not rather than blindly rs.commit() here.

// TODO: Move copied pSBC code out of here!

// TODO: create field registry, add fields here

// The use of `Object#toString` avoids issues with the `typeof` operator

// This will throw an exception if access to iframe is blocked

// Try to read the message from Ext.Error.lang

// Use `util.types` for Node.js 10+.

// Validate Summary maxLength

// Validate Summary minLength

// Wait for all attendee processing to complete

// We need to get all resources and store them in memory for default Data Creation

// _('GENDER_Calendar')

// _('No Access') - we need this string in other apps if relation is not shown e.g. record_removed_reason

// _('Set as a definite event')

// a combo with all attendee + origin/organizer

// a personal container of the current user

// abort edit on ESC key

// abort normal flow

// activate grid header menu for column selection

// activeView.showEvent(record)

// activities and tags

// add admin (and other) grant for resource managers

// add detail panel

// add each list member to fixedGroups

// add filter toolbar

// add groupmember for user

// add more actions here (no spam / apply / crush / send event / ...)

// add new attendee

// add new user:

// add or edit?

// add period filter as last filter to not conflict with first OR filter

// add phone call action via item registry

// add pre defined type

// add subviews new to filter

// adjust date to user preference

// adjust initial size to avoid flickering when start resizing

// adjust scrollConfig

// after items are rendered

// all but option attendee

// allow overwriting date pattern in model

// allow status setting if status authkey is present

// allways start with an empty filter set!

// alt -> prefer calendarOwner in intelligent mode

// and the button handling is complicated

// android chrome

// apply os specific scrolling space

// apply preferences

// assemble event actions

// attendeePickerCombo

// auto location

// autoHeight: true,

// autocomplete view

// backward compatibility to store.js

// baseCls: 'ux-subformpanel',

// blow up if no successProperty

// blue

// brown

// calculate duration and parallels

// calculate period start

// change attendee in split view

// check for hint clicks first

// check if displaycontainer of owner got changed

// check if event is currently visible by looking into ui.domIds

// check if events fits into view @see Tine.Calendar.MainScreenCenterPanel::congruenceFilterCheck

// check if store is current store

// check preconditions

// checks for null and undefined

// clean empty slices

// clear favorites

// clear selections from other views

// clear state

// click vs. setValue!

// compute status icons

// const keyFieldDef = Tine.Tinebase.widgets.keyfield.getDefinitionFromMC(this.constructor, this.titleProperty);

// const state = Ext.state.Manager.get('cal-pgtb-pp-wkbtn');

// constrain to other boundary

// constraint to graticule

// convert old boolean argument

// copy arguments first

// create a copy of selection so selection changes don't affect this

// create method call params

// create parallels registry

// create view for each attendee

// crop daytime

// date has no time part

// day headers

// default format by locale and with two decimals

// default type is auto

// defer to have the loadMask centered in case of rendering actions

// define once

// deprecated

// deselect/reduce

// detect duplicate entry

// disable container selection combo if user has no right to edit

// disable for the moment, as updating calendarSelectWidget is not working in both directions

// disable relations panel for non persistent exceptions till we have the baseEventId

// disable time selectors if this is a whole day event

// disable unselect on radio item

// display spam box -> might be accepted by user?

// do we have a 'real' event?

// don't allow dragging of dirty events

// don't allow dragging with missing edit grant

// don't allow to set anything besides quantity and role for already set attendee

// don't care for right btn

// don't create events with very small duration

// don't delete 'add' row

// don't fire update events on rangeAdd

// don't polute global namspace if no one else did

// don't save initial 'add attendee' record

// don't update events while being created

// draged from allDay -> droped to scroller will be resetted to hone hour

// draged from scroller -> dropped to allDay and duration less than a day

// due to cross-origin restrictions

// e.g. history panel

// each safe for removal

// edit existing container

// else

// end of pSBC

// endif

// event copy

// example for explicit definition

// fallback to default value

// filter grid helper field

// finally apend generic options from Calendar_Import_Abstract

// find container by selection or use defaultContainer by registry

// find record from dataset

// find record from deeplink

// fixme: check precondition failed, allow it in be ?

// for Object prototype breakers

// for all other fields user need editGrant

// for prototype!

// force event length to at least 1 minute

// force positioning on scroll hints

// frame: true,

// get default data from fields config

// get events in this day

// getRzInfo calcs wrong values???

// give browser some time to clear registry

// grant helper fields

// green

// grid could not be refreshed at the moment, maybe a row has been deleted

// grid specific

// happens if month view is rendered first

// have less optical focus

// height: 30,

// here to prevent dependency on Date.js

// hidden atm.

// hide button and make sure it isn't pressed

// hook into getDefaultData 

// how to detect hash/string ids

// https://github.com/PimpTrizkit/PJs/edit/master/pSBC.js

// i18n._('Add Attendee')

// i18n._('Add Events')

// i18n._('Delete Events')

// i18n._('Edit Events')

// i18n._('Edit Resource')

// i18n._('Event (as attendee)')

// i18n._('Event (as organizer)')

// i18n._('Events Free/Busy')

// i18n._('Export Events')

// i18n._('Export Resource')

// i18n._('Free/Busy')

// i18n._('Invite Resource')

// i18n._('Private')

// i18n._('Read Events')

// i18n._('Read Resource')

// i18n._('Resource Admin')

// i18n._('Resource notification')

// i18n._('Resource status')

// i18n._('Sync Events')

// i18n._('Sync Resource')

// i18n._('The permission to administrate the resource itself')

// i18n._('The permission to delete events directly stored in this resource calendar')

// i18n._('The permission to directly add events to this resource calendar')

// i18n._('The permission to edit events directly saved in this resource calendar')

// i18n._('The permission to edit the resource itself')

// i18n._('The permission to export events from this resource calendar')

// i18n._('The permission to export the resource itself')

// i18n._('The permission to get free/busy information of events from this resource calendar')

// i18n._('The permission to get free/busy information of events in this calendar')

// i18n._('The permission to invite the resource to an event')

// i18n._('The permission to read events from this resource calendar')

// i18n._('The permission to read the resource itself')

// i18n._('The permission to receive notifications for this resource')

// i18n._('The permission to set the resource attendee status')

// i18n._('The permission to synchronise events from this resource calendar. A Read Events grant is required.')

// i18n._('The permission to synchronise the resource itself')

// ical common fields

// ical common fields with multiple appearance

// id: event.get('id'),

// if

// if default data is empty, it will be resolved to an array

// if dtstart is out of current period, take start of current period

// if no id, call the auto id method

// if recordType defined make sure extraction functions are defined

// if var app is a record class, the getMeta method is called

// if we are currently firing this event, don't disturb the listener loop

// import a list of modules into the list

// in Safari 9 which returns 'object' for typed arrays and other constructors.

// init autoRefresh

// init dragables

// init map

// init plugins

// init some translations

// init state now to render menu with state applied

// initialize new poll

// inpired by a similar function in mootools library

// insert event silently into store

// instantiate response object

// internal

// iso week

// istanbul ignore if

// istanbul ignore next

// iterate days

// layout helper

// layout whole day area -> take one third of the available height maximum

// layout: 'form',

// lazy init

// lazy init tempalte

// lcocal COPY!

// let from = this.fromPicker.getValue() || new Date

// light gray

// load poll

// make args available, in function below

// make sure cell is empty

// make sure new-attendee line is on the bottom

// make sure, last reccurance is included

// manage active views

// manage main (main is shown if no split criteria is present)

// mark as new rule to avoid series confirm dlg

// mark event as not dirty to allow edit dlg

// maybe another app is active

// method specific text / actions

// mhh - if the user already declined we can't see the event

// might happen in shared folders -> we might want to become a party crusher?

// model generics

// monthSheet is a bitch!

// more brown

// named sortTypes are supported, here we look them up

// needed for action updater / save and close in edit dialog

// needed for addToEventPanel

// neglegt diffs due to borders etc.

// new Ext.ux.Printer.TagsRenderer().generateBody(component.getForm().findField('tags').tagsPanel),

// new calendar

// new container

// ngettext('Attender', 'Attendee', n); gettext('Attendee');

// ngettext('Calendar', 'Calendars', n); gettext('Calendars');

// ngettext('Event', 'Events', n); gettext('Events');

// ngettext('Resource Grant', 'Resource Grants', n); gettext('Resource Grant');

// ngettext('Resource', 'Resources', n); gettext('Resources');

// no "this" reference for friendly out of scope calls

// no arguments means programatic scroll (show/hide/...)

// no keys for quickadds etc.

// no record after delete

// no selection of external organizers here yet

// non async event listener returned false

// non objects are treated as ids and -> No Information

// normal events container

// normalise

// normalize

// not a regex

// not yet

// not yet used? - let's save space

// note, we can't use the 'normal' plugin approach here, cause we have to deal with n stores

// note: unprecise plural form here, but this is hard to change

// nothing to do

// ommit loadMask

// on initialisation items are not renderd

// one of['me', 'intelligent', 'calendarOwner', 'filteredAttendee', 'none']

// only add range events if mouse is down long enough

// only apply filter plugin when used as mainscreen leftpanel

// only commit edit on Enter & blur

// only unzoom if click is not in the area of the daypreviewbox

// orange

// origin container will only be moved for personal events with their origin in

// origin w.o. skip of this perspective + specials for this perspective

// outdated data

// override via prototype or config

// override, when required.

// pSBC - Shade Blend Convert - Version 4.0 - 02/18/2019

// party crush button?

// php for [className, functionName]

// prebuilt conversion function for this field, instead of

// preserve space for triggers

// preset quickadd

// prevent adding of fixed calendars

// private

// private function a store will createSequence upon

// protected.  Extensions place their error-strings here.

// purple

// put the events in

// quick add/update actions

// rebind store so it's event listeners get called at last.

// recalculate dtstart according to WeekPeriodPicker.Button

// record is JSON encoded here...

// record.commit();

// recurse

// red

// redefine this props in case ext translations got included after this component

// redirect only after logout (redirectAlways == false) - we can't wait for the browser here...

// refetch record as it might be outdated in the meantime

// register calendar filters in addressbook

// register grants for calendar containers

// relations

// relayout actual context

// relayout original context

// reload mainscreen to make sure registry gets updated

// reload registry/mainscreen - registry problem?

// remove "add new attender" row

// remove all existing period filters

// remove attender ids

// remove css image flicker

// remove event_types ids

// remove fake user_id from external email

// remove from ui before update

// remove not longer existing attendee

// remove old events

// remove resource calendars user has appropriate grants for

// remove temporary id

// remove views not longer in filter

// reset autoRefresh

// reset autoRefresh it might get lost if request fails

// reset if perspective attendee is gone

// resize header/scroller to fullsize

// resize mainBody for visibleMinutes to fit

// resolve group members

// resolve members for memberOf filters

// resource events container

// return false will the generic exceptionhandler handle the caught exception

// return the list of modules as css string

// run action updater

// sanitize containerProperty label

// save current startDate

// save some layout info

// save state

// save west panel scrolling position so we can restore it after selecting nodes

// scheduleable interface fields

// scheduleable interface fields with multiple appearance

// scrollTo initial position

// see if a recent startDate of that view fits

// select name cell

// select only current page

// select/expand

// self register

// send click event anyway

// set default sortType for strings and dates

// set some default time:

// set status authkey for contacts and recources so user can edit status directly

// shift -> change intelligent <-> me

// shortcut

// show container from existing event if exists

// show icon on startCell and leftCells

// show origin (if available)

// simple cache for applying multiple behaviors to same selector does query multiple times

// skip dates not in our diplay range

// skip out of range events

// skip updates from new attendee row

// snap correction for rangeadds

// so dumb!

// so just lets reload

// some old browsers...

// something like 24:00 and not 00:00

// start sizing for range adds

// support array as roots

// support container records

// support grid renderers

// support records

// switch editor

// switch to run as app has no view right

// switching every time we're reading a value

// sync attendee status

// take a full clone to not taint the original filter

// take displayContainer if user has no access to origin

// take one third of the available height maximum

// the else clause below will detect !this.isData and throw exception.

// the event was selected before

// the field is already blured, due to the extra chooser window. We need to change the value per hand

// this is important for paging and sort header!

// this prevents reopen of cell on header clicks

// this.calPanel.relayEvents(view, ['changeView', 'changePeriod', 'addEvent', 'updateEvent', 'click', 'dblclick', 'contextmenu', 'keydown']);

// this.calendarView.scrollTo.defer(500, this.calendarView, [this.record.get('dtstart')]);

// this.form.findField('location').setValue(rec.get('n_fn'));

// this.periodLabel.update(this.period.from.format())

// title: this.app.i18n._('Choose File and Format'),

// to allow gridpanel hooks (like email compose)

// todo: sort generic?

// transform grants for event container selection

// transition customGrid -> sheetView

// tree comes with containers only

// try to force landscape -> opera only atm...

// unique to Safari 2

// update actions

// update attendee filter grid

// update container tree

// update data

// update dates and bg colors

// update filter panel

// update grid after import

// update header & scaling

// update weeks

// use 'interna' Ext we create and export here

// use first OR panel in case of filterPanel

// use first attedee filter

// userData contains account

// userData contains contact

// userData contains group

// userData contains list

// var cp = this.app.getMainScreen().getCenterPanel(),

// violet

// walk all cols an hide hints

// we can't evaluate the filters on client side to check compute if this affects us

// we do a strict check to return the element with only the id attribute

// we dont support multiple dropping yet

// we expect user_id to be a user or contact object or record

// we need some fieldDef to get filter working

// we need some fieldDef to get grouping store working

// we need to clone an event with summary in

// weights of color values see: https://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color

// weird...rs is an array but data isn't??  recurse but just send in the whole data object.

// weird...rs is an array but data isn't??  recurse but just send in the whole invalid data object.

// west panel attendee filter grid

// without arguments the php class name of the this is returned

// works on IE10/11 and Surface

//'1px'

//@TODO improve detection or pipe as config

//@TODO remove relayed events?

//TODO reenable

//TODO: return html element and get the format ?

//TODO: use grid panel hook ?

//Tine.Calendar.Model.Attender.getRecordName();

//Tine.Calendar.backend.getReader(),

//Tine.widgets.grid.FilterRegistry.register('Addressbook', 'Contact', {

//assert position

//autoLoad: true,

//calendarSelectionPlugin.onBeforeLoad.call(calendarSelectionPlugin, store, options);

//clsToAdd = ((this.dateMesh[i].getMonth() == this.startDate.getMonth()) ? ' cal-yearview-daycell-valid' : ' cal-yearview-daycell-invalid');

//console.info('pushed event in frame# ' + position + ' from startIdx"' + startIdx + '" to endIdx "' + endIdx + '".');

//console.log(Ext.get(target));

//day: date.get('dateString'),

//delete this.grid;

//dependentLocality: '',

//dynamic: !!this.event.isRangeAdd,

//e.stopEvent();

//event.ui.render(this);

//eventEl[height > this.dayCellsHeight && hideOverflow ? 'hide' : 'show']();

//eventEls[0].setOpacity(0.5);

//eventEls[0].setStyle({'border-left-style': 'dashed'});

//fieldLabel    : this.intervalBeforeString,

//height: 230,

//hidden: this.tb.activeView != 'day',

//hidden: this.tb.activeView != 'month',

//listWidth: 300,

//no loadMask called from another app

//offset = row*numCols;

//remove location if location is location from deleted ressource

//return height;

//return this.supr().updateDetails.apply(this, arguments);

//rs.commit();

//sortingCode: '',

//store.on("loadexception", this.onLoadError, this);

//store.un("loadexception", this.onLoadError, this);

//style: 'padding-top: 2px;',

//style: 'padding: 10px 0 0 20px;',

//this.blur();

//this.cardPanel.layout.setActiveItem(this.cardPanel.items.getKey(this.eventDetailsPanel));

//this.colMgr = Tine.Calendar.colorMgr;

//this.constrains = new Tine.widgets.container.SelectionComboBox({

//this.fireEvent('contextmenu', e);

//this.focus();

//this.grid.getSelectionModel().selectAll(true);

//this.parallelScrollerEventsRegistry = new Tine.Calendar.ParallelEventsRegistry({dtStart: this.startDate, dtEnd: this.endDate});

//this.parallelWholeDayEventsRegistry = new Tine.Calendar.ParallelEventsRegistry({dtStart: this.startDate, dtEnd: this.endDate});

//this.store.each(this.removeEvent, this);

//todo: implement printing for timeline views?

//todo: show save action only when needed

//var calendarSelectionPlugin = this.app.getMainScreen().getWestPanel().getContainerTreePanel().getFilterPlugin();

//var eventEls = event.ui.getEls();

//var row = i%12, col = Math.floor(i/12);

//width: 300,

//{ name: 'attach' },

//{ name: 'contact' },

//{ name: 'exrule' },

//{ name: 'rdate' },

//{ name: 'related' },

//{ name: 'resources' },

//{ name: 'rstatus' },

//{label: i18n._('Created by'),                                                        field: 'created_by',         valueType: 'user'},

//{label: i18n._('Last Modified by'),                                                  field: 'last_modified_by',   valueType: 'user'},

//});
