Your IP : 216.73.217.112


Current Path : /home/z/i/e/zieirix/www/plugins/system/jaosmap/assets/
Upload File :
Current File : /home/z/i/e/zieirix/www/plugins/system/jaosmap/assets/jaosmap.js

// json handler from mootool core
(function(){

var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};

var escape = function(chr){
	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
};

JSON.validate = function(string){
	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
					replace(/(?:^|:|,)(?:\s*\[)+/g, '');

	return (/^[\],:{}\s]*$/).test(string);
};

JSON.encode = JSON.stringify;

JSON.decode = function(string, secure){
	if (!string || typeof string != 'string') return null;

	if (secure == null) secure = JSON.secure;
	if (secure){
		if (JSON.parse) return JSON.parse(string);
		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
	}

	return eval('(' + string + ')');
};

})();

// ja osmap
(function(root, $) {
	var juri_root = root.Joomla.getOptions('jaosmap').juri_root;

	var JAOSMAP = function() {
		this.map = null;
	};

	JAOSMAP.prototype.render = function(selector, settings) {
		var self = this;
		var marks = typeof settings.locations === 'string' ? JSON.decode(settings.locations) : settings.locations;
		if (!marks || !marks.latitude || !marks.longitude) {
			return;
		}

		var wheel = +settings.disable_scrollwheelzoom ? true : false;
		self.map = L.map(selector, {
			scrollWheelZoom: wheel
		});

		if (settings.maptype == 'style' && settings.custom_style !== "" && settings.custom_style_token !== "") {
		    // use custom style code for map.
		    // the layer must be right after add the map.
            var gl = L.mapboxGL({
                accessToken: settings.custom_style_token,
                style: settings.custom_style
            }).addTo(self.map);
		} else {
            // use normal tile map
            var maptype = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
            if (settings.maptype == 'cycle')
                maptype = 'https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png';
            if (settings.maptype == 'transport')
                maptype = 'https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png';
            if (settings.maptype == 'humanitarian')
                maptype = 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png';
            if (settings.maptype == 'custom') {
                if (settings.custom_tile !== '')
                    maptype = settings.custom_tile;
            }

            L.tileLayer(maptype, {
                attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(self.map);
		}

		var deferreds = [];
		var pointers = [];

		$.each(marks.latitude, function(m) {
			if (marks.latitude[m] === '' 
				|| marks.longitude[m] === '' 
				|| isNaN(marks.latitude[m]) 
				|| isNaN(marks.longitude[m])) {
				return;
			}

			var pointer = {
				latitude: marks.latitude[m] ? marks.latitude[m] : 0,
				longitude: marks.longitude[m] ? marks.longitude[m] : 0,
				info: (marks.info && marks.info[m]) ? marks.info[m] : '',
				icon: (marks.icon && marks.icon[m]) ? marks.icon[m] : '',
				location: (marks.location && marks.location[m]) ? marks.location[m] : ''
			}
		
			pointers.push(pointer);
		});
		
		if (!pointers.length) {
			return;
		}

		if (settings.mode === 'routing') {
			var def = self.addWaypoints(self.map, pointers, settings);
			deferreds.push(def);
		} else {
			pointers.forEach(function(pointer) {
				var def = self.addMarker(self.map, pointer, settings);
				deferreds.push(def);
			});
		}

		var first = pointers[0];
		var last = pointers[pointers.length - 1];
		var zoom = settings.zoom > 18 ? 18 : settings.zoom;

		if (settings.center === 'all') {
			$.when.apply($, deferreds).then(function() {
				var points = pointers.map(function(item) {
					return [item.latitude, item.longitude];
				})

				self.map.fitBounds(points);
			})
		} else {
			var view = settings.center === 'first' ? first : last;
			self.map.setView( L.latLng(view.latitude, view.longitude), zoom );
		}
		return self.map;
	}

	JAOSMAP.prototype.addWaypoints = function(map, pointers, settings) {
		var self = this;
		return $.Deferred(function(defer) {
			var config = {};
			var langs = {
				'ar-aa': 'ar',
				'da-dk': 'da',
				'de-de': 'de',
				'en-gb': 'en',
				'eo-xx': 'eo',
				'es-es': 'es-ES',
				'es-co': 'es',
				'fi-fi': 'fi',
				'fr-fr': 'fr',
				'he-il': 'he',
				'id-id': 'id',
				'it-it': 'it',
				'ko-kr': 'ko',
				'my-my': 'my',
				'nl-nl': 'no',
				'no-nb': 'no',
				'pl-pl': 'pl',
				'pt-br': 'pt-BR',
				'pt-pt': 'pt-PT',
				'ro-ro': 'ro',
				'ru-ru': 'ru',
				'sl-si': 'sl',
				'sv-se': 'sv',
				'tr-tr': 'tr',
				'uk-ua': 'uk',
				'vi-vn': 'vi',
				'zh-cn': 'zh-Hans'
			}

			var language = langs[settings.routing_language] ? langs[settings.routing_language] : 'en';
			var options = {
				language: language
			}

			if (settings.route === 'mapbox') {
				config.router = L.Routing.mapbox(settings.mapbox_access_token, options);
			} else {
				config.router = L.Routing.osrmv1(options);
			}

			var waypoints = pointers.map(function(item) {
				return L.latLng(item.latitude, item.longitude);
			});

			var deferreds = [];
			pointers.forEach(function(item) {
				if (item.icon) {
					var def = self.getCustomIcon(item);
					deferreds.push(def);
				} else {
					deferreds.push(false);
				}
			})

			$.when.apply($, deferreds).then(function() {
				var markers = arguments;
				L.Routing.control(L.extend(config, {
					waypoints: waypoints,
					routeWhileDragging: true,
					reverseWaypoints: true,
					showAlternatives: true,
					createMarker: function(i, wp) {
						var pointer = pointers[i];
						var marker;
						if (markers[i]) {
							marker = markers[i];
						} else {
							marker = L.marker([wp.latLng.lat, wp.latLng.lng]);
						}

						if (pointer.info !== '') {
							if (settings.popup_type == 'click')
								marker.bindPopup(pointer.info);
							if (settings.popup_type == 'hover')
								marker.bindTooltip(pointer.info);
						}

						return marker;
					},
					show: false,
					collapsible: true
				})).addTo(map);
				defer.resolve();
			})
		})
	}

	JAOSMAP.prototype.addMarker = function(map, pointer, settings) {
		var self = this;
		return $.Deferred(function(defer) {
			var latitude = pointer.latitude;
			var longitude = pointer.longitude;
			var def = new $.Deferred();
			var marker;

			if (pointer.icon) {
				self.getCustomIcon(pointer).then(function(_marker) {
					marker = _marker;
					marker.addTo(map);
					def.resolve(marker)
				})
			} else {
				var marker = L.marker([latitude, longitude]).addTo(map);
				def.resolve(marker);
			}

			def.then(function() {
				if (pointer.info !== '') {
					if (settings.popup_type == 'click')
						marker.bindPopup(pointer.info);
					if (settings.popup_type == 'hover')
						marker.bindTooltip(pointer.info);
				}
				defer.resolve();
			})
		})
	}

	JAOSMAP.prototype.getCustomIcon = function(pointer) {
		return $.Deferred(function(defer) {
			var imgWidth = 0;
			var imgHeight = 0;
			var MAX = 40;
			var regex = /^(https|http):\/\//g;
			var url = regex.test(pointer.icon) ? pointer.icon : juri_root + pointer.icon;

			$("<img/>", {
				src: url,
				load: function() {
					if (this.width < MAX || this.height < MAX) {
						imgWidth = this.width;
						imgHeight = this.height;
					} else if (this.width < this.height) {
						imgWidth = MAX;
						imgHeight = (this.height * imgWidth) / this.width;
					} else {
						imgHeight = MAX;
						imgWidth = (this.width * imgHeight) / this.height;
					}

					var icon = L.icon({
						iconUrl: url,
						iconSize: [imgWidth, imgHeight],
						iconAnchor: [imgWidth / 2, imgHeight],
						popupAnchor: [0, (imgHeight / 4) - imgHeight],
						tooltipAnchor: [0, (imgHeight / 4) - imgHeight]
					});

					var marker = L.marker(
						[pointer.latitude, pointer.longitude],
						{icon: icon}
					);

					defer.resolve(marker);
				}
			})
		})
	}
	
	

	root.JAOSMAP = JAOSMAP;
})(window, jQuery)