summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js')
-rw-r--r--www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js228
1 files changed, 228 insertions, 0 deletions
diff --git a/www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js b/www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js
new file mode 100644
index 00000000..44da9a13
--- /dev/null
+++ b/www/wiki/extensions/Maps/resources/lib/leaflet.fullscreen/Control.FullScreen.js
@@ -0,0 +1,228 @@
+(function () {
+
+L.Control.FullScreen = L.Control.extend({
+ options: {
+ position: 'topleft',
+ title: 'Full Screen',
+ titleCancel: 'Exit Full Screen',
+ forceSeparateButton: false,
+ forcePseudoFullscreen: false,
+ fullscreenElement: false
+ },
+
+ onAdd: function (map) {
+ var className = 'leaflet-control-zoom-fullscreen', container, content = '';
+
+ if (map.zoomControl && !this.options.forceSeparateButton) {
+ container = map.zoomControl._container;
+ } else {
+ container = L.DomUtil.create('div', 'leaflet-bar');
+ }
+
+ if (this.options.content) {
+ content = this.options.content;
+ } else {
+ className += ' fullscreen-icon';
+ }
+
+ this._createButton(this.options.title, className, content, container, this.toggleFullScreen, this);
+ this._map.fullscreenControl = this;
+
+ this._map.on('enterFullscreen exitFullscreen', this._toggleTitle, this);
+
+ return container;
+ },
+
+ onRemove: function (map) {
+ L.DomEvent
+ .off(this.link, 'click', L.DomEvent.stopPropagation)
+ .off(this.link, 'click', L.DomEvent.preventDefault)
+ .off(this.link, 'click', this.toggleFullScreen, this);
+
+ L.DomEvent
+ .off(this._container, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation)
+ .off(this._container, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault)
+ .off(this._container, fullScreenApi.fullScreenEventName, this._handleFullscreenChange, this);
+
+ L.DomEvent
+ .off(document, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation)
+ .off(document, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault)
+ .off(document, fullScreenApi.fullScreenEventName, this._handleFullscreenChange, this);
+ },
+
+ _createButton: function (title, className, content, container, fn, context) {
+ this.link = L.DomUtil.create('a', className, container);
+ this.link.href = '#';
+ this.link.title = title;
+ this.link.innerHTML = content;
+
+ this.link.setAttribute('role', 'button');
+ this.link.setAttribute('aria-label', title);
+
+ L.DomEvent
+ .on(this.link, 'click', L.DomEvent.stopPropagation)
+ .on(this.link, 'click', L.DomEvent.preventDefault)
+ .on(this.link, 'click', fn, context);
+
+ L.DomEvent
+ .on(container, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation)
+ .on(container, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault)
+ .on(container, fullScreenApi.fullScreenEventName, this._handleFullscreenChange, context);
+
+ L.DomEvent
+ .on(document, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation)
+ .on(document, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault)
+ .on(document, fullScreenApi.fullScreenEventName, this._handleFullscreenChange, context);
+
+ return this.link;
+ },
+
+ toggleFullScreen: function () {
+ var map = this._map;
+ map._exitFired = false;
+ if (map._isFullscreen) {
+ if (fullScreenApi.supportsFullScreen && !this.options.forcePseudoFullscreen) {
+ fullScreenApi.cancelFullScreen();
+ } else {
+ L.DomUtil.removeClass(this.options.fullscreenElement ? this.options.fullscreenElement : map._container, 'leaflet-pseudo-fullscreen');
+ }
+ map.fire('exitFullscreen');
+ map._exitFired = true;
+ map._isFullscreen = false;
+ }
+ else {
+ if (fullScreenApi.supportsFullScreen && !this.options.forcePseudoFullscreen) {
+ fullScreenApi.requestFullScreen(this.options.fullscreenElement ? this.options.fullscreenElement : map._container);
+ } else {
+ L.DomUtil.addClass(this.options.fullscreenElement ? this.options.fullscreenElement : map._container, 'leaflet-pseudo-fullscreen');
+ }
+ map.fire('enterFullscreen');
+ map._isFullscreen = true;
+ }
+ },
+
+ _toggleTitle: function () {
+ this.link.title = this._map._isFullscreen ? this.options.title : this.options.titleCancel;
+ },
+
+ _handleFullscreenChange: function () {
+ var map = this._map;
+ map.invalidateSize();
+ if (!fullScreenApi.isFullScreen() && !map._exitFired) {
+ map.fire('exitFullscreen');
+ map._exitFired = true;
+ map._isFullscreen = false;
+ }
+ }
+});
+
+L.Map.include({
+ toggleFullscreen: function () {
+ this.fullscreenControl.toggleFullScreen();
+ }
+});
+
+L.Map.addInitHook(function () {
+ if (this.options.fullscreenControl) {
+ this.addControl(L.control.fullscreen(this.options.fullscreenControlOptions));
+ }
+});
+
+L.control.fullscreen = function (options) {
+ return new L.Control.FullScreen(options);
+};
+
+/*
+Native FullScreen JavaScript API
+-------------
+Assumes Mozilla naming conventions instead of W3C for now
+
+source : http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/
+
+*/
+
+ var
+ fullScreenApi = {
+ supportsFullScreen: false,
+ isFullScreen: function () { return false; },
+ requestFullScreen: function () {},
+ cancelFullScreen: function () {},
+ fullScreenEventName: '',
+ prefix: ''
+ },
+ browserPrefixes = 'webkit moz o ms khtml'.split(' ');
+
+ // check for native support
+ if (typeof document.exitFullscreen !== 'undefined') {
+ fullScreenApi.supportsFullScreen = true;
+ } else {
+ // check for fullscreen support by vendor prefix
+ for (var i = 0, il = browserPrefixes.length; i < il; i++) {
+ fullScreenApi.prefix = browserPrefixes[i];
+ if (typeof document[fullScreenApi.prefix + 'CancelFullScreen'] !== 'undefined') {
+ fullScreenApi.supportsFullScreen = true;
+ break;
+ }
+ }
+ if (typeof document['msExitFullscreen'] !== 'undefined') {
+ fullScreenApi.prefix = 'ms';
+ fullScreenApi.supportsFullScreen = true;
+ }
+ }
+
+ // update methods to do something useful
+ if (fullScreenApi.supportsFullScreen) {
+ if (fullScreenApi.prefix === 'ms') {
+ fullScreenApi.fullScreenEventName = 'MSFullscreenChange';
+ } else {
+ fullScreenApi.fullScreenEventName = fullScreenApi.prefix + 'fullscreenchange';
+ }
+ fullScreenApi.isFullScreen = function () {
+ switch (this.prefix) {
+ case '':
+ return document.fullscreen;
+ case 'webkit':
+ return document.webkitIsFullScreen;
+ case 'ms':
+ return document.msFullscreenElement;
+ default:
+ return document[this.prefix + 'FullScreen'];
+ }
+ };
+ fullScreenApi.requestFullScreen = function (el) {
+ switch (this.prefix) {
+ case '':
+ return el.requestFullscreen();
+ case 'ms':
+ return el.msRequestFullscreen();
+ default:
+ return el[this.prefix + 'RequestFullScreen']();
+ }
+ };
+ fullScreenApi.cancelFullScreen = function () {
+ switch (this.prefix) {
+ case '':
+ return document.exitFullscreen();
+ case 'ms':
+ return document.msExitFullscreen();
+ default:
+ return document[this.prefix + 'CancelFullScreen']();
+ }
+ };
+ }
+
+ // jQuery plugin
+ if (typeof jQuery !== 'undefined') {
+ jQuery.fn.requestFullScreen = function () {
+ return this.each(function () {
+ var el = jQuery(this);
+ if (fullScreenApi.supportsFullScreen) {
+ fullScreenApi.requestFullScreen(el);
+ }
+ });
+ };
+ }
+
+ // export api
+ window.fullScreenApi = fullScreenApi;
+})();