[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / organiseur / lib / fullcalendar / gcal.js
index 7e89533..bddcd1f 100644 (file)
 /*!
- * FullCalendar v3.2.0 Google Calendar Plugin
+ * FullCalendar v3.9.0
  * Docs & License: https://fullcalendar.io/
- * (c) 2017 Adam Shaw
+ * (c) 2018 Adam Shaw
  */
-(function(factory) {
-       if (typeof define === 'function' && define.amd) {
-               define([ 'jquery' ], factory);
-       }
-       else if (typeof exports === 'object') { // Node/CommonJS
-               module.exports = factory(require('jquery'));
-       }
-       else {
-               factory(jQuery);
-       }
-})(function($) {
-
-
-var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
-var FC = $.fullCalendar;
-var applyAll = FC.applyAll;
-
-
-FC.sourceNormalizers.push(function(sourceOptions) {
-       var googleCalendarId = sourceOptions.googleCalendarId;
-       var url = sourceOptions.url;
-       var match;
-
-       // if the Google Calendar ID hasn't been explicitly defined
-       if (!googleCalendarId && url) {
-
-               // detect if the ID was specified as a single string.
-               // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
-               if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
-                       googleCalendarId = url;
-               }
-               // try to scrape it out of a V1 or V3 API feed URL
-               else if (
-                       (match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
-                       (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))
-               ) {
-                       googleCalendarId = decodeURIComponent(match[1]);
-               }
-
-               if (googleCalendarId) {
-                       sourceOptions.googleCalendarId = googleCalendarId;
-               }
-       }
-
-
-       if (googleCalendarId) { // is this a Google Calendar?
-
-               // make each Google Calendar source uneditable by default
-               if (sourceOptions.editable == null) {
-                       sourceOptions.editable = false;
-               }
-
-               // We want removeEventSource to work, but it won't know about the googleCalendarId primitive.
-               // Shoehorn it into the url, which will function as the unique primitive. Won't cause side effects.
-               // This hack is obsolete since 2.2.3, but keep it so this plugin file is compatible with old versions.
-               sourceOptions.url = googleCalendarId;
-       }
-});
-
-
-FC.sourceFetchers.push(function(sourceOptions, start, end, timezone) {
-       if (sourceOptions.googleCalendarId) {
-               return transformOptions(sourceOptions, start, end, timezone, this); // `this` is the calendar
-       }
-});
-
-
-function transformOptions(sourceOptions, start, end, timezone, calendar) {
-       var url = API_BASE + '/' + encodeURIComponent(sourceOptions.googleCalendarId) + '/events?callback=?'; // jsonp
-       var apiKey = sourceOptions.googleCalendarApiKey || calendar.options.googleCalendarApiKey;
-       var success = sourceOptions.success;
-       var data;
-       var timezoneArg; // populated when a specific timezone. escaped to Google's liking
-
-       function reportError(message, apiErrorObjs) {
-               var errorObjs = apiErrorObjs || [ { message: message } ]; // to be passed into error handlers
-
-               // call error handlers
-               (sourceOptions.googleCalendarError || $.noop).apply(calendar, errorObjs);
-               (calendar.options.googleCalendarError || $.noop).apply(calendar, errorObjs);
-
-               // print error to debug console
-               FC.warn.apply(null, [ message ].concat(apiErrorObjs || []));
-       }
-
-       if (!apiKey) {
-               reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/");
-               return {}; // an empty source to use instead. won't fetch anything.
-       }
-
-       // The API expects an ISO8601 datetime with a time and timezone part.
-       // Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each
-       // side, guaranteeing we will receive all events in the desired range, albeit a superset.
-       // .utc() will set a zone and give it a 00:00:00 time.
-       if (!start.hasZone()) {
-               start = start.clone().utc().add(-1, 'day');
-       }
-       if (!end.hasZone()) {
-               end = end.clone().utc().add(1, 'day');
-       }
-
-       // when sending timezone names to Google, only accepts underscores, not spaces
-       if (timezone && timezone != 'local') {
-               timezoneArg = timezone.replace(' ', '_');
-       }
-
-       data = $.extend({}, sourceOptions.data || {}, {
-               key: apiKey,
-               timeMin: start.format(),
-               timeMax: end.format(),
-               timeZone: timezoneArg,
-               singleEvents: true,
-               maxResults: 9999
-       });
-
-       return $.extend({}, sourceOptions, {
-               googleCalendarId: null, // prevents source-normalizing from happening again
-               url: url,
-               data: data,
-               startParam: false, // `false` omits this parameter. we already included it above
-               endParam: false, // same
-               timezoneParam: false, // same
-               success: function(data) {
-                       var events = [];
-                       var successArgs;
-                       var successRes;
-
-                       if (data.error) {
-                               reportError('Google Calendar API: ' + data.error.message, data.error.errors);
-                       }
-                       else if (data.items) {
-                               $.each(data.items, function(i, entry) {
-                                       var url = entry.htmlLink || null;
-
-                                       // make the URLs for each event show times in the correct timezone
-                                       if (timezoneArg && url !== null) {
-                                               url = injectQsComponent(url, 'ctz=' + timezoneArg);
-                                       }
-
-                                       events.push({
-                                               id: entry.id,
-                                               title: entry.summary,
-                                               start: entry.start.dateTime || entry.start.date, // try timed. will fall back to all-day
-                                               end: entry.end.dateTime || entry.end.date, // same
-                                               url: url,
-                                               location: entry.location,
-                                               description: entry.description
-                                       });
-                               });
-
-                               // call the success handler(s) and allow it to return a new events array
-                               successArgs = [ events ].concat(Array.prototype.slice.call(arguments, 1)); // forward other jq args
-                               successRes = applyAll(success, this, successArgs);
-                               if ($.isArray(successRes)) {
-                                       return successRes;
-                               }
-                       }
-
-                       return events;
-               }
-       });
-}
-
-
-// Injects a string like "arg=value" into the querystring of a URL
-function injectQsComponent(url, component) {
-       // inject it after the querystring but before the fragment
-       return url.replace(/(\?.*?)?(#|$)/, function(whole, qs, hash) {
-               return (qs ? qs + '&' : '?') + component + hash;
-       });
-}
-
-
-});
+(function webpackUniversalModuleDefinition(root, factory) {
+       if(typeof exports === 'object' && typeof module === 'object')
+               module.exports = factory(require("fullcalendar"), require("jquery"));
+       else if(typeof define === 'function' && define.amd)
+               define(["fullcalendar", "jquery"], factory);
+       else if(typeof exports === 'object')
+               factory(require("fullcalendar"), require("jquery"));
+       else
+               factory(root["FullCalendar"], root["jQuery"]);
+})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_3__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/       // The module cache
+/******/       var installedModules = {};
+/******/
+/******/       // The require function
+/******/       function __webpack_require__(moduleId) {
+/******/
+/******/               // Check if module is in cache
+/******/               if(installedModules[moduleId]) {
+/******/                       return installedModules[moduleId].exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = installedModules[moduleId] = {
+/******/                       i: moduleId,
+/******/                       l: false,
+/******/                       exports: {}
+/******/               };
+/******/
+/******/               // Execute the module function
+/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/               // Flag the module as loaded
+/******/               module.l = true;
+/******/
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/
+/******/
+/******/       // expose the modules object (__webpack_modules__)
+/******/       __webpack_require__.m = modules;
+/******/
+/******/       // expose the module cache
+/******/       __webpack_require__.c = installedModules;
+/******/
+/******/       // define getter function for harmony exports
+/******/       __webpack_require__.d = function(exports, name, getter) {
+/******/               if(!__webpack_require__.o(exports, name)) {
+/******/                       Object.defineProperty(exports, name, {
+/******/                               configurable: false,
+/******/                               enumerable: true,
+/******/                               get: getter
+/******/                       });
+/******/               }
+/******/       };
+/******/
+/******/       // getDefaultExport function for compatibility with non-harmony modules
+/******/       __webpack_require__.n = function(module) {
+/******/               var getter = module && module.__esModule ?
+/******/                       function getDefault() { return module['default']; } :
+/******/                       function getModuleExports() { return module; };
+/******/               __webpack_require__.d(getter, 'a', getter);
+/******/               return getter;
+/******/       };
+/******/
+/******/       // Object.prototype.hasOwnProperty.call
+/******/       __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/       // __webpack_public_path__
+/******/       __webpack_require__.p = "";
+/******/
+/******/       // Load entry module and return exports
+/******/       return __webpack_require__(__webpack_require__.s = 266);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 1:
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE_1__;
+
+/***/ }),
+
+/***/ 2:
+/***/ (function(module, exports) {
+
+/*\r
+derived from:\r
+https://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js\r
+
+only include the helpers we need, to keep down filesize\r
+*/\r
+var extendStatics = Object.setPrototypeOf ||\r
+    ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r
+    function (d, b) { for (var p in b)\r
+        if (b.hasOwnProperty(p))\r
+            d[p] = b[p]; };\r
+exports.__extends = function (d, b) {\r
+    extendStatics(d, b);\r
+    function __() { this.constructor = d; }\r
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r
+};\r
+
+
+/***/ }),
+
+/***/ 266:
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });\r
+var exportHooks = __webpack_require__(1);\r
+var GcalEventSource_1 = __webpack_require__(267);\r
+exportHooks.EventSourceParser.registerClass(GcalEventSource_1.default);\r
+exportHooks.GcalEventSource = GcalEventSource_1.default;\r
+
+
+/***/ }),
+
+/***/ 267:
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });\r
+var tslib_1 = __webpack_require__(2);\r
+var $ = __webpack_require__(3);\r
+var fullcalendar_1 = __webpack_require__(1);\r
+var GcalEventSource = /** @class */ (function (_super) {\r
+    tslib_1.__extends(GcalEventSource, _super);\r
+    function GcalEventSource() {\r
+        return _super !== null && _super.apply(this, arguments) || this;\r
+    }\r
+    GcalEventSource.parse = function (rawInput, calendar) {\r
+        var rawProps;\r
+        if (typeof rawInput === 'object') {\r
+            rawProps = rawInput;\r
+        }\r
+        else if (typeof rawInput === 'string') {\r
+            rawProps = { url: rawInput }; // url will be parsed with parseGoogleCalendarId\r
+        }\r
+        if (rawProps) {\r
+            return fullcalendar_1.EventSource.parse.call(this, rawProps, calendar);\r
+        }\r
+        return false;\r
+    };\r
+    GcalEventSource.prototype.fetch = function (start, end, timezone) {\r
+        var _this = this;\r
+        var url = this.buildUrl();\r
+        var requestParams = this.buildRequestParams(start, end, timezone);\r
+        var ajaxSettings = this.ajaxSettings || {};\r
+        var onSuccess = ajaxSettings.success;\r
+        if (!requestParams) {\r
+            return fullcalendar_1.Promise.reject();\r
+        }\r
+        this.calendar.pushLoading();\r
+        return fullcalendar_1.Promise.construct(function (onResolve, onReject) {\r
+            $.ajax($.extend({}, // destination\r
+            fullcalendar_1.JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {\r
+                url: url,\r
+                data: requestParams,\r
+                success: function (responseData, status, xhr) {\r
+                    var rawEventDefs;\r
+                    var successRes;\r
+                    _this.calendar.popLoading();\r
+                    if (responseData.error) {\r
+                        _this.reportError('Google Calendar API: ' + responseData.error.message, responseData.error.errors);\r
+                        onReject();\r
+                    }\r
+                    else if (responseData.items) {\r
+                        rawEventDefs = _this.gcalItemsToRawEventDefs(responseData.items, requestParams.timeZone);\r
+                        successRes = fullcalendar_1.applyAll(onSuccess, _this, [responseData, status, xhr]); // passthru\r
+                        if ($.isArray(successRes)) {\r
+                            rawEventDefs = successRes;\r
+                        }\r
+                        onResolve(_this.parseEventDefs(rawEventDefs));\r
+                    }\r
+                },\r
+                error: function (xhr, statusText, errorThrown) {\r
+                    _this.reportError('Google Calendar network failure: ' + statusText, [xhr, errorThrown]);\r
+                    _this.calendar.popLoading();\r
+                    onReject();\r
+                }\r
+            }));\r
+        });\r
+    };\r
+    GcalEventSource.prototype.gcalItemsToRawEventDefs = function (items, gcalTimezone) {\r
+        var _this = this;\r
+        return items.map(function (item) {\r
+            return _this.gcalItemToRawEventDef(item, gcalTimezone);\r
+        });\r
+    };\r
+    GcalEventSource.prototype.gcalItemToRawEventDef = function (item, gcalTimezone) {\r
+        var url = item.htmlLink || null;\r
+        // make the URLs for each event show times in the correct timezone\r
+        if (url && gcalTimezone) {\r
+            url = injectQsComponent(url, 'ctz=' + gcalTimezone);\r
+        }\r
+        return {\r
+            id: item.id,\r
+            title: item.summary,\r
+            start: item.start.dateTime || item.start.date,\r
+            end: item.end.dateTime || item.end.date,\r
+            url: url,\r
+            location: item.location,\r
+            description: item.description\r
+        };\r
+    };\r
+    GcalEventSource.prototype.buildUrl = function () {\r
+        return GcalEventSource.API_BASE + '/' +\r
+            encodeURIComponent(this.googleCalendarId) +\r
+            '/events?callback=?'; // jsonp\r
+    };\r
+    GcalEventSource.prototype.buildRequestParams = function (start, end, timezone) {\r
+        var apiKey = this.googleCalendarApiKey || this.calendar.opt('googleCalendarApiKey');\r
+        var params;\r
+        if (!apiKey) {\r
+            this.reportError('Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/');\r
+            return null;\r
+        }\r
+        // The API expects an ISO8601 datetime with a time and timezone part.\r
+        // Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each\r
+        // side, guaranteeing we will receive all events in the desired range, albeit a superset.\r
+        // .utc() will set a zone and give it a 00:00:00 time.\r
+        if (!start.hasZone()) {\r
+            start = start.clone().utc().add(-1, 'day');\r
+        }\r
+        if (!end.hasZone()) {\r
+            end = end.clone().utc().add(1, 'day');\r
+        }\r
+        params = $.extend(this.ajaxSettings.data || {}, {\r
+            key: apiKey,\r
+            timeMin: start.format(),\r
+            timeMax: end.format(),\r
+            singleEvents: true,\r
+            maxResults: 9999\r
+        });\r
+        if (timezone && timezone !== 'local') {\r
+            // when sending timezone names to Google, only accepts underscores, not spaces\r
+            params.timeZone = timezone.replace(' ', '_');\r
+        }\r
+        return params;\r
+    };\r
+    GcalEventSource.prototype.reportError = function (message, apiErrorObjs) {\r
+        var calendar = this.calendar;\r
+        var calendarOnError = calendar.opt('googleCalendarError');\r
+        var errorObjs = apiErrorObjs || [{ message: message }]; // to be passed into error handlers\r
+        if (this.googleCalendarError) {\r
+            this.googleCalendarError.apply(calendar, errorObjs);\r
+        }\r
+        if (calendarOnError) {\r
+            calendarOnError.apply(calendar, errorObjs);\r
+        }\r
+        // print error to debug console\r
+        fullcalendar_1.warn.apply(null, [message].concat(apiErrorObjs || []));\r
+    };\r
+    GcalEventSource.prototype.getPrimitive = function () {\r
+        return this.googleCalendarId;\r
+    };\r
+    GcalEventSource.prototype.applyManualStandardProps = function (rawProps) {\r
+        var superSuccess = fullcalendar_1.EventSource.prototype.applyManualStandardProps.apply(this, arguments);\r
+        var googleCalendarId = rawProps.googleCalendarId;\r
+        if (googleCalendarId == null && rawProps.url) {\r
+            googleCalendarId = parseGoogleCalendarId(rawProps.url);\r
+        }\r
+        if (googleCalendarId != null) {\r
+            this.googleCalendarId = googleCalendarId;\r
+            return superSuccess;\r
+        }\r
+        return false;\r
+    };\r
+    GcalEventSource.prototype.applyMiscProps = function (rawProps) {\r
+        if (!this.ajaxSettings) {\r
+            this.ajaxSettings = {};\r
+        }\r
+        $.extend(this.ajaxSettings, rawProps);\r
+    };\r
+    GcalEventSource.API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';\r
+    return GcalEventSource;\r
+}(fullcalendar_1.EventSource));\r
+exports.default = GcalEventSource;\r
+GcalEventSource.defineStandardProps({\r
+    // manually process...\r
+    url: false,\r
+    googleCalendarId: false,\r
+    // automatically transfer...\r
+    googleCalendarApiKey: true,\r
+    googleCalendarError: true\r
+});\r
+function parseGoogleCalendarId(url) {\r
+    var match;\r
+    // detect if the ID was specified as a single string.\r
+    // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.\r
+    if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {\r
+        return url;\r
+    }\r
+    else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||\r
+        (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {\r
+        return decodeURIComponent(match[1]);\r
+    }\r
+}\r
+// Injects a string like "arg=value" into the querystring of a URL\r
+function injectQsComponent(url, component) {\r
+    // inject it after the querystring but before the fragment\r
+    return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {\r
+        return (qs ? qs + '&' : '?') + component + hash;\r
+    });\r
+}\r
+
+
+/***/ }),
+
+/***/ 3:
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
+
+/***/ })
+
+/******/ });
+});
\ No newline at end of file