123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- CKEDITOR.dialog.add('leaflet', function(editor) {
- // Dialog's function callback for the Leaflet Map Widget.
- return {
- title: 'Create/Edit Leaflet Map',
- minWidth: 320,
- minHeight: 125,
- contents: [{
- // Create a Location tab.
- id: 'location_tab',
- label: 'Location',
- elements: [
- {
- id: 'map_geocode',
- className: 'geocode',
- type: 'text',
- label: 'Auto-Search of Coordinates.',
- style: 'margin-top: -7px;',
- setup: function(widget) {
- this.setValue("");
- },
- onShow: function (widget) {
- // Get the DOM reference for the Search field.
- var input = jQuery(".geocode input")[0];
- // Bind the Search field to the Autocomplete widget.
- var autocomplete = new google.maps.places.Autocomplete(input);
- // Fix for the Google's type-ahead search displaying behind
- // the widgets dialog window.
- // Basically, we want to override the z-index of the
- // Seach Autocomplete list, in which the styling is being set
- // in real-time by Google.
- // Make a new DOM element.
- var stylesheet = jQuery('<style type="text/css" />');
- // Set the inner HTML. Include also the vertical alignment
- // adjustment for the MiniMap checkbox.
- stylesheet.html('.pac-container { z-index: 100000 !important;} input.minimap { margin-top: 18px !important; }');
- // Append to the main document's Head section.
- jQuery('head').append(stylesheet);
- },
- },
- { // Dummy element serving as label/text container only.
- type: 'html',
- id: 'map_label',
- className: 'label',
- style: 'margin-bottom: -10px;',
- html: '<p>Manual Input of Coordinates:</p>'
- },
- {
- // Create a new horizontal group.
- type: 'hbox',
- // Set the relative widths of Latitude, Longitude and Zoom fields.
- widths: [ '50%', '50%' ],
- children: [
- {
- id: 'map_latitude',
- className: 'latitude',
- type: 'text',
- label: 'Latitude',
- setup: function(widget) {
- // Set the Lat values if widget has previous value.
- if (widget.element.data('lat') != "") {
- this.setValue(widget.element.data('lat'));
- }
- },
- },
- {
- id: 'map_longitude',
- className: 'longitude',
- type: 'text',
- label: 'Longitude',
- setup: function(widget) {
- // Set the Lat values if widget has previous value.
- if (widget.element.data('lon') != "") {
- this.setValue(widget.element.data('lon'));
- }
- },
- },
- ]
- },
- {
- id: 'popup_text',
- className: 'popup-text',
- type: 'text',
- label: 'Pop-up Text (Optional)',
- style: 'margin-bottom: 8px;',
- setup: function(widget) {
- // Set the Lat values if widget has previous value.
- if (widget.element.data('popup-text') != "") {
- this.setValue(widget.element.data('popup-text'));
- }
- else {
- // Set a diffused/default text for better user experience.
- jQuery(".popup-text input").attr("placeholder", "Enter the marker's text.")
- }
- },
- },
- ]
- },
- {
- // Create an Options tab.
- id: 'options_tab',
- label: 'Options',
- elements: [
- {
- // Create a new horizontal group.
- type: 'hbox',
- style: 'margin-top: -7px;',
- // Set the relative widths of Latitude, Longitude and Zoom fields.
- widths: [ '38%', '38%', '24%' ],
- children: [
- {
- id: 'width',
- className: 'map_width',
- type: 'text',
- label: 'Map Width',
- setup: function(widget) {
- // Set a diffused/default text for better user experience.
- jQuery(".map_width input").attr("placeholder", "400")
- // Set the map width value if widget has a previous value.
- if (widget.element.data('width') != "") {
- this.setValue(widget.element.data('width'));
- }
- },
- },
- {
- id: 'height',
- className: 'map_height',
- type: 'text',
- label: 'Map Height',
- setup: function(widget) {
- // Set a diffused/default text for better user experience.
- jQuery(".map_height input").attr("placeholder", "400")
- // Set the map height value if widget has a previous value.
- if (widget.element.data('height') != "") {
- this.setValue(widget.element.data('height'));
- }
- },
- },
- {
- // Create a select list for Zoom Levels.
- // 'className' attribute is used for targeting this element in jQuery.
- id: 'map_zoom',
- className: 'zoom',
- type: 'select',
- label: 'Zoom Level',
- width: '70px',
- items: [['1'], ['2'], ['3'], ['4'],['5'], ['6'], ['7'], ['8'], ['9'], ['10'], ['11'], ['12'], ['13'], ['14'], ['15'], ['16'], ['17'], ['18'], ['19'], ['20']],
- // This will execute also every time you edit/double-click the widget.
- setup: function(widget) {
- // Set this Zoom Level's select list when
- // the current location has been initialized and set previously.
- if (widget.element.data('zoom') != "") {
- // Get the previously saved zoom value data attribute.
- // It will be compared to the current value in the map view.
- var zoomSaved = widget.element.data('zoom');
- // Get the zoom level's snapshot because the current user
- // might have changed it via mouse events or via the zoom bar.
- var zoomIframe = widget.element.getChild(0).$.contentDocument.getElementById("map_container").getAttribute("data-zoom");
- if (zoomIframe != zoomSaved) {
- // Update the saved zoom value in data attribute.
- zoomSaved = zoomIframe;
- }
- this.setValue(zoomSaved);
- }
- // Set the Default Zoom Level value.
- else {
- this.setValue("10");
- }
- },
- }
- ]
- },
- {
- // Create a new horizontal group.
- type: 'hbox',
- // Set the relative widths the tile and overview map fields.
- widths: [ '50%', '50%' ],
- children: [
- {
- // Create a select list for map tiles.
- // 'className' attribute is used for targeting this element in jQuery.
- type: 'select',
- id: 'map_tile',
- className: 'tile',
- label: 'Base Map Tile',
- items: [['MapQuestOpen.OSM'], ['MapQuestOpen.Aerial'], ['OpenStreetMap.Mapnik'], ['OpenStreetMap.DE'], ['OpenStreetMap.HOT'], ['Esri.DeLorme'], ['Esri.NatGeoWorldMap'], ['Esri.WorldPhysical'], ['Esri.WorldTopoMap'], ['Thunderforest.OpenCycleMap'], ['Thunderforest.Landscape'], ['Stamen.Watercolor']],
- // This will execute also every time you edit/double-click the widget.
- setup: function(widget) {
- // Set the Tile data attribute.
- if (widget.element.data('tile') != "") {
- this.setValue(widget.element.data('tile'));
- }
- else {
- // Set the default value.
- this.setValue('MapQuestOpen.OSM');
- }
- },
- // This will execute every time you click the Dialog's OK button.
- // It will inject a map iframe in the CKEditor page.
- commit: function(widget) {
- // Remove the iframe if it has one.
- widget.element.setHtml('');
- // Retrieve the value in the Search field.
- var geocode = jQuery('.geocode input').val();
- var latitude, longitude;
- if (geocode != "") {
- // No need to call the encodeURIComponent().
- var geocodingRequest = "https://maps.googleapis.com/maps/api/geocode/json?address=" + geocode + "&sensor=false";
- // Disable the asynchoronous behavior temporarily so that
- // waiting for results will happen before proceeding
- // to the next statements.
- jQuery.ajaxSetup({
- async: false
- });
- // Geocode the retrieved place name.
- jQuery.getJSON(geocodingRequest, function(data) {
- if (data["status"] != "ZERO_RESULTS") {
- // Get the Latitude and Longitude object in the
- // returned JSON object.
- latitude = data.results[0].geometry.location.lat;
- longitude = data.results[0].geometry.location.lng;
- }
- // Handle queries with no results or have some
- // malformed parameters.
- else {
- alert("The Place could not be Geocoded properly. Kindly choose another one.")
- }
- });
- }
- // Get the Lat/Lon values from the corresponding fields.
- var latInput = jQuery('.latitude input').val();
- var lonInput = jQuery('.longitude input').val();
- // Get the data-lat and data-lon values.
- // It is empty for yet to be created widgets.
- var latSaved = widget.element.data('lat');
- var lonSaved = widget.element.data('lon');
- // Used the inputted values if it's not empty or
- // not equal to the previously saved values.
- // latSaved and lonSaved are initially empty also
- // for widgets that are yet to be created.
- // Or if the user edited an existing map, and did not edit
- // the lat/lon fields, and the Search field is empty.
- if ((latInput != "" && lonInput != "") && ((latInput != latSaved && lonInput != lonSaved) || geocode == "")) {
- latitude = latInput;
- longitude = lonInput;
- }
- var width = jQuery(".map_width input").val() || "400";
- var height = jQuery(".map_height input").val() || "400";
- var zoom = jQuery('select.zoom').val();
- var popUpText = jQuery(".popup-text input").val();
- var tile = jQuery('select.tile').val();
- var alignment = jQuery('select.alignment').val();
- // Returns 'on' or 'undefined'.
- var minimap = jQuery('.minimap input:checked').val();
- // Use 'off' if the MiniMap checkbox is unchecked.
- if (minimap == undefined) {
- minimap = 'off';
- }
- // Get a unique timestamp:
- var milliseconds = new Date().getTime();
- // Set/Update the widget's data attributes.
- widget.element.setAttribute('id', 'leaflet_div-' + milliseconds);
- widget.element.data('lat', latitude);
- widget.element.data('lon', longitude);
- widget.element.data('width', width);
- widget.element.data('height', height);
- widget.element.data('zoom', zoom);
- widget.element.data('popup-text', popUpText);
- widget.element.data('tile', tile);
- widget.element.data('minimap', minimap);
- widget.element.data('alignment', alignment);
- // Remove the previously set alignment class.
- // Only one alignment class is set per map.
- widget.element.removeClass('align-left');
- widget.element.removeClass('align-right');
- widget.element.removeClass('align-center');
- // Set the alignment for this map.
- widget.element.addClass('align-' + alignment);
- // Build the full path to the map renderer.
- mapParserPathFull = mapParserPath + "?lat=" + latitude + "&lon=" + longitude + "&width=" + width + "&height=" + height + "&zoom=" + zoom + "&text=" + popUpText + "&tile=" + tile + "&minimap=" + minimap;
- // Create a new CKEditor DOM's iFrame.
- var iframe = new CKEDITOR.dom.element('iframe');
- // Setup the iframe characteristics.
- iframe.setAttributes({
- 'scrolling': 'no',
- 'id': 'leaflet_iframe-' + milliseconds,
- 'class': 'leaflet_iframe',
- 'width': width + 'px',
- 'height': height + 'px',
- 'frameborder': 0,
- 'allowTransparency': true,
- 'src': mapParserPathFull,
- 'data-cke-saved-src': mapParserPathFull
- });
- // Insert the iframe to the widget's DIV element.
- widget.element.append(iframe);
- },
- },
- {
- type: 'checkbox',
- id: 'map_mini',
- className: 'minimap',
- label: 'Include MiniMap',
- // This will execute also every time you edit/double-click the widget.
- setup: function(widget) {
- // Set the MiniMap check button.
- if (widget.element.data('minimap') != "" && widget.element.data('minimap') != "on") {
- this.setValue('');
- }
- else {
- // Set the default value.
- this.setValue('true');
- }
- },
- }
- ]
- },
- {
- // Create a select list for Map Alignment.
- // 'className' attribute is used for targeting this element in jQuery.
- id: 'map_alignment',
- className: 'alignment',
- type: 'select',
- label: 'Alignment',
- items: [['Left', 'left'], ['Right', 'right'], ['Center', 'center']],
- style: 'margin-bottom: 4px;',
- // This will execute also every time you edit/double-click the widget.
- setup: function(widget) {
- // Set this map alignment's select list when
- // the current map has been initialized and set previously.
- if (widget.element.data('alignment') != "") {
- // Set the alignment.
- this.setValue(widget.element.data('alignment'));
- }
- // Set the Default alignment value.
- else {
- this.setValue("left");
- }
- },
- }
- ]
- }]
- };
- });
|