Current File : /home/jvzmxxx/wiki1/extensions/Kartographer/modules/editing/editing.js
/* globals module */
/**
 * Module containing useful methods when editing a map.
 *
 * @alias Editing
 * @alias ext.kartographer.editing
 * @class Kartographer.Editing
 * @singleton
 */
module.exports = ( function ( $, mw ) {

	/**
	 * Get "editable" geojson layer for the map.
	 *
	 * If a layer doesn't exist, create and attach one.
	 *
	 * @param {L.Map} map Map to get layers from
	 * @param {L.mapbox.FeatureLayer} map.kartographerLayer show tag-specific info in this layer
	 * @return {L.mapbox.FeatureLayer|null} GeoJSON layer, if present
	 */
	function getKartographerLayer( map ) {
		if ( !map.kartographerLayer ) {
			map.kartographerLayer = L.mapbox.featureLayer().addTo( map );
		}
		return map.kartographerLayer;
	}

	/**
	 * Updates "editable" GeoJSON layer from a string.
	 *
	 * Validates the GeoJSON against the `sanitize-mapdata` api
	 * before executing it.
	 *
	 * The deferred object will be resolved with a `boolean` flag
	 * indicating whether the GeoJSON was valid and was applied.
	 *
	 * @param {L.Map} map Map to set the GeoJSON for
	 * @param {string} geoJsonString GeoJSON data, empty string to clear
	 * @return {jQuery.Promise} Promise which resolves when the GeoJSON is updated, and rejects if there was an error
	 */
	function updateKartographerLayer( map, geoJsonString ) {
		var deferred = $.Deferred();

		if ( geoJsonString === '' ) {
			return deferred.resolve().promise();
		}

		new mw.Api().post( {
			action: 'sanitize-mapdata',
			text: geoJsonString,
			title: mw.config.get( 'wgPageName' )
		} ).done( function ( resp ) {
			var geoJson, layer,
				data = resp[ 'sanitize-mapdata' ];

			geoJsonString = data && data.sanitized;

			if ( geoJsonString && !data.error ) {
				try {
					geoJson = JSON.parse( geoJsonString );
					layer = getKartographerLayer( map );
					layer.setGeoJSON( geoJson );
					deferred.resolve();
				} catch ( e ) {
					deferred.reject( e );
				}
			} else {
				deferred.reject();
			}
		} );

		return deferred.promise();
	}

	return {
		getKartographerLayer: getKartographerLayer,
		updateKartographerLayer: updateKartographerLayer
	};

}( jQuery, mediaWiki ) );