| <div class="narrow"> | |
|   <?= partial('partials/header') ?> | |
|  | |
|     <div style="clear: both;"> | |
|       <div class="alert alert-success hidden" id="test_success"><strong>Success! </strong><a href="" id="post_href">View your post</a></div> | |
|       <div class="alert alert-danger hidden" id="test_error"><strong>Something went wrong!</strong><br>Your Micropub endpoint indicated that something went wrong creating the post.</div> | |
|     </div> | |
|  | |
|     <form role="form" style="margin-top: 20px;" id="note_form"> | |
|  | |
|       <div class="form-group" style="margin-top: 18px;"> | |
|         <label>Event Name</label> | |
|         <input type="text" class="form-control" id="event_name" placeholder="" value=""> | |
|       </div> | |
|  | |
|       <div class="form-group" style="margin-top: 18px;"> | |
|         <label>Location</label> | |
|         <input type="text" class="form-control" id="event_location" placeholder="" value=""> | |
|         <span class="help-block" id="location_preview"></span> | |
|       </div> | |
|  | |
|       <div id="map" class="hidden" style="width: 100%; height: 180px; border-radius: 4px; border: 1px #ccc solid;"></div> | |
|  | |
|       <div class="form-group" id="start_date" style="margin-top: 18px;"> | |
|         <label>Start Date/Time</label> | |
|         <div class="form-group"> | |
|           <input type="text" class="form-control date" placeholder="<?= date('Y-m-d') ?>" value="" style="max-width: 40%; margin-right: 4px; float: left;"> | |
|           <input type="text" class="form-control time" placeholder="14:30" value="" style="max-width: 40%; margin-right: 4px; float: left;"> | |
|           <input type="text" class="form-control timezone" placeholder="-08:00" style="max-width: 15%;"> | |
|         </div> | |
|       </div> | |
|  | |
|       <div class="form-group" id="end_date" style="margin-top: 18px;"> | |
|         <label>End Date/Time (Optional)</label> | |
|         <div class="form-group"> | |
|           <input type="text" class="form-control date" placeholder="<?= date('Y-m-d') ?>" value="" style="max-width: 40%; margin-right: 4px; float: left;"> | |
|           <input type="text" class="form-control time" placeholder="14:30" value="" style="max-width: 40%; margin-right: 4px; float: left;"> | |
|           <input type="text" class="form-control timezone" placeholder="-08:00" style="max-width: 15%;"> | |
|         </div> | |
|       </div> | |
|  | |
|       <div id="presentation-fields" class="hidden"> | |
|  | |
|         <div class="form-group" style="margin-top: 18px;"> | |
|           <label>Link to Slides</label> | |
|           <input type="url" class="form-control" id="slides"> | |
|         </div> | |
|  | |
|         <div class="form-group"> | |
|           <label for="slides-embed">Slides Embed Code</label> | |
|           <textarea id="slides-embed" class="form-control" style="height: 4em;"></textarea> | |
|         </div> | |
|  | |
|         <div class="form-group" style="margin-top: 18px;"> | |
|           <label>Link to Video</label> | |
|           <input type="url" class="form-control" id="video-link"> | |
|         </div> | |
|  | |
|         <div class="form-group"> | |
|           <label for="video-embed">Video Embed Code</label> | |
|           <textarea id="video-embed" class="form-control" style="height: 4em;"></textarea> | |
|         </div> | |
|  | |
|         <div class="form-group" style="margin-top: 18px;"> | |
|           <label>Conference</label> | |
|           <div class="form-group"> | |
|             <input type="text" id="conference-name" class="form-control" style="max-width: 48%; margin-right: 4px; float: left;" placeholder="Conference Name"> | |
|             <input type="url" id="conference-url" class="form-control" style="max-width: 48%; margin-right: 4px; float: left;" placeholder="https://example.com"> | |
|           </div> | |
|           <div style="clear:both;"></div> | |
|         </div> | |
|  | |
|       </div> | |
|  | |
|       <div class="form-group"> | |
|         <label for="note_content">Content</label> | |
|         <textarea id="note_content" value="" class="form-control" rows="6"></textarea> | |
|       </div> | |
|  | |
|       <div class="form-group hidden" id="content-type-selection"> | |
|         <label for="note_content_type">Content Type</label> | |
|         <select class="form-control" id="note_content_type"> | |
|           <option value="text/plain">Text</option> | |
|           <option value="text/markdown">Markdown</option> | |
|         </select> | |
|       </div> | |
|  | |
|       <div class="form-group" style="margin-top: 18px;"> | |
|         <label for="note_category">Tags</label> | |
|         <input type="text" id="note_category" value="" class="form-control"> | |
|       </div> | |
|  | |
|       <?php if($this->channels): ?> | |
|         <div class="form-group"> | |
|           <label for="note_channel">Channel</label> | |
|           <div id="channel-container"> | |
|             <?php | |
|               echo '<select class="form-control" id="note_channel">'; | |
|               echo '<option value="none"></option>'; | |
|               foreach($this->channels as $ch) { | |
|                 echo '<option value="'.htmlspecialchars($ch).'" '.($ch == 'events' ? 'selected' : '').'>' | |
|                    . htmlspecialchars($ch) | |
|                . '</option>'; | |
|               } | |
|               echo '</select>'; | |
|             ?> | |
|           </div> | |
|         </div> | |
|       <?php endif; ?> | |
|  | |
|       <div style="float: right; margin-top: 6px;"> | |
|         <button class="btn btn-success" id="btn_post">Post</button> | |
|       </div> | |
|  | |
|     </form> | |
|  | |
| </div> | |
|  | |
| <link rel="stylesheet" href="/libs/bootstrap-typeahead/typeahead.css"> | |
| <script src="/libs/bootstrap-typeahead/typeahead.min.js"></script> | |
| <?php if(Config::$googleMapsAPIKey): ?> | |
| <script src="https://maps.googleapis.com/maps/api/js?key=<?= Config::$googleMapsAPIKey ?>&libraries=places"></script> | |
| <?php endif ?> | |
| <script> | |
|   <?php if(Config::$googleMapsAPIKey): ?> | |
|   var map = new google.maps.Map(document.getElementById('map'), { | |
|     center: new google.maps.LatLng(-45,122), | |
|     zoom: 15 | |
|   }); | |
|   <?php else: ?> | |
|   var map = null; | |
|   <?php endif ?> | |
|  | |
|   var d = new Date(); | |
|   var tzOffset = tz_seconds_to_offset(d.getTimezoneOffset() * 60 * -1); | |
|  | |
|   var selectedPlace; | |
|   if(map) { | |
|     var gservice = new google.maps.places.AutocompleteService(); | |
|     var gplaces = new google.maps.places.PlacesService(map); | |
|     var selectedPlacePin; | |
|   } | |
|  | |
|   $(document).bind('keydown', function(e){ | |
|     // Easter egg: press ctrl+shift+c to reveal a content type selection | |
|     if(e.keyCode == 67 && e.ctrlKey && e.shiftKey) { | |
|       $("#content-type-selection").removeClass("hidden"); | |
|     } | |
|     // Easter egg: press ctrl+shift+m to switch to markdown | |
|     if(e.keyCode == 77 && e.ctrlKey && e.shiftKey) { | |
|       switchToMarkdown(); | |
|     } | |
|     // Enable "presentation mode" which adds a few fields | |
|     if(e.keyCode == 80 && e.ctrlKey && e.shiftKey) { | |
|       enablePresentationMode(); | |
|     } | |
|   }); | |
|  | |
|   function switchToMarkdown() { | |
|     $("#content-type-selection select").val("text/markdown"); | |
|     $("#content-type-selection").removeClass("hidden"); | |
|   } | |
|  | |
|   function enablePresentationMode() { | |
|     $("#presentation-fields").removeClass("hidden"); | |
|   } | |
|  | |
|   $(function(){ | |
|     // Start the event timezone offset in the browser's timezone | |
|     $("#start_date .timezone").attr("placeholder", tzOffset); | |
|     $("#end_date .timezone").attr("placeholder", tzOffset); | |
|  | |
|     // As soon as a time is entered, move the placeholder offset to the value | |
|     $("#start_date .time").on("keydown", function(){ | |
|       $("#start_date .timezone").val($("#start_date .timezone").attr("placeholder")); | |
|     }); | |
|     $("#end_date .time").on("keydown", function(){ | |
|       $("#end_date .timezone").val($("#end_date .timezone").attr("placeholder")); | |
|     }); | |
|  | |
|     if(map) { | |
|       $("#event_location").typeahead({ | |
|         minLength: 3, | |
|         highlight: true | |
|       }, { | |
|         limit: 5, | |
|         async: true, | |
|         source: function(query, sync, async) { | |
|           gservice.getPlacePredictions({ input: query }, function(predictions, status) { | |
|             if (status == google.maps.places.PlacesServiceStatus.OK) { | |
|               async(predictions); | |
|             } | |
|           }); | |
|         }, | |
|         display: function(item) { | |
|           return item.description; | |
|         }, | |
|         templates: { | |
|           suggestion: function(item) { | |
|             return '<span>'+item.description+'</span>'; | |
|           } | |
|         } | |
|       }).bind('typeahead:select', function(ev, suggestion) { | |
|  | |
|         gplaces.getDetails({ | |
|           placeId: suggestion.place_id, | |
|           fields: ["geometry", "name", "address_component", "url", "utc_offset"] | |
|         }, function(result, status) { | |
|           if(status != google.maps.places.PlacesServiceStatus.OK) { | |
|             alert('Cannot find address'); | |
|             return; | |
|           } | |
|           console.log(result); | |
|  | |
|           map.setCenter(result.geometry.location); | |
|  | |
|           if(selectedPlacePin) { | |
|             selectedPlacePin.setMap(null); | |
|             selectedPlacePin = null; | |
|           } | |
|           selectedPlacePin = new google.maps.Marker({ | |
|             position: result.geometry.location, | |
|             map: map | |
|           }); | |
|  | |
|           selectedPlace = { | |
|             type: ["h-card"], | |
|             properties: { | |
|               name: [result.name], | |
|               latitude: [result.geometry.location.lat()], | |
|               longitude: [result.geometry.location.lng()], | |
|             } | |
|           }; | |
|  | |
|           address = ''; | |
|           locality = ''; | |
|           region = ''; | |
|           country = ''; | |
|           for(var i in result.address_components) { | |
|  | |
|             if(result.address_components[i].types.includes('street_number')) { | |
|               address += ' '+result.address_components[i].short_name; | |
|             } | |
|             if(result.address_components[i].types.includes('route')) { | |
|               address += ' '+result.address_components[i].short_name; | |
|             } | |
|  | |
|             if(result.address_components[i].types.includes('locality')) { | |
|               locality = result.address_components[i].long_name; | |
|             } | |
|             if(result.address_components[i].types.includes('administrative_area_level_1')) { | |
|               region = result.address_components[i].long_name; | |
|             } | |
|             if(result.address_components[i].types.includes('country')) { | |
|               country = result.address_components[i].short_name; | |
|             } | |
|           } | |
|           if(address) { | |
|             selectedPlace['properties']['street-address'] = [address.trim()]; | |
|           } | |
|           if(locality) { | |
|             selectedPlace['properties']['locality'] = [locality]; | |
|           } | |
|           if(region) { | |
|             selectedPlace['properties']['region'] = [region]; | |
|           } | |
|           if(country) { | |
|             selectedPlace['properties']['country-name'] = [country]; | |
|           } | |
|  | |
|           if(result.utc_offset) { | |
|             tzOffset = tz_seconds_to_offset(result.utc_offset * 60); | |
|             $("#start_date .timezone").attr("placeholder", tzOffset); | |
|             $("#end_date .timezone").attr("placeholder", tzOffset); | |
|             if($("#start_date .timezone").val()) { | |
|               $("#start_date .timezone").val($("#start_date .timezone").attr("placeholder")); | |
|             } | |
|             if($("#end_date .timezone").val()) { | |
|               $("#end_date .timezone").val($("#end_date .timezone").attr("placeholder")); | |
|             } | |
|           } | |
|  | |
|           $("#map").removeClass("hidden"); | |
|           $("#location_preview").text(''); | |
|         }); | |
|       }); | |
|     } | |
|   }); | |
|  | |
|   $("#note_category").tokenfield({ | |
|     createTokensOnBlur: true, | |
|     beautify: true | |
|   }); | |
|  | |
|   $("#btn_post").click(function(){ | |
|  | |
|     var event_start = $("#start_date .date").val(); | |
|     if($("#start_date .time").val()) { | |
|       event_start += "T"+$("#start_date .time").val()+$("#start_date .timezone").val(); | |
|     } | |
|     var event_end; | |
|     if($("#end_date .date").val()) { | |
|       event_end = $("#end_date .date").val(); | |
|       if($("#end_date .time").val()) { | |
|         event_end += "T"+$("#end_date .time").val()+$("#end_date .timezone").val(); | |
|       } | |
|     } | |
|  | |
|     var properties = { | |
|       name: [$("#event_name").val()], | |
|       start: [event_start], | |
|       location: (selectedPlace ? selectedPlace : $("#event_location").val()), | |
|       category: tokenfieldToArray("#note_category"), | |
|       content: $("#note_content").val() | |
|     }; | |
|  | |
|     if(event_end) { | |
|       properties.end = event_end; | |
|     } | |
|  | |
|     if($("#note_channel").val()) { | |
|       properties['p3k-channel'] = $("#note_channel").val(); | |
|     } | |
|  | |
|     if(!$("#content-type-selection").hasClass("hidden")) { | |
|       properties['p3k-content-type'] = $("#note_content_type").val(); | |
|     } | |
|  | |
|     if(!$("#presentation-fields").hasClass("hidden")) { | |
|       properties['slides'] = $("#slides").val(); | |
|       properties['slides-embed'] = $("#slides-embed").val(); | |
|       properties['video-link'] = $("#video-link").val(); | |
|       properties['video-embed'] = $("#video-embed").val(); | |
|       if($("#conference-name").val()) { | |
|         properties['conference'] = { | |
|           type: 'h-event', | |
|           properties: { | |
|             name: $("#conference-name").val(), | |
|             url: $("#conference-url").val() | |
|           } | |
|         }; | |
|       } | |
|     } | |
|  | |
|     $.post("/micropub/postjson", { | |
|       data: JSON.stringify({ | |
|         "type": ["h-event"], | |
|         "properties": properties | |
|       }) | |
|     }, function(response){ | |
|  | |
|       if(response.location != false) { | |
|         $("#test_success").removeClass('hidden'); | |
|         $("#test_error").addClass('hidden'); | |
|         $("#post_href").attr("href", response.location); | |
|         $("#note_form").slideUp(200, function(){ | |
|           $(window).scrollTop($("#test_success").position().top); | |
|         }); | |
|       } else { | |
|         $("#test_success").addClass('hidden'); | |
|         $("#test_error").removeClass('hidden'); | |
|       } | |
|  | |
|     }); | |
|     return false; | |
|   }); | |
| </script>
 |