-
Notifications
You must be signed in to change notification settings - Fork 0
/
timeline.js.map
1 lines (1 loc) · 732 KB
/
timeline.js.map
1
{"version":3,"sources":["webpack://TL/webpack/bootstrap","webpack://TL/./node_modules/dompurify/dist/purify.js","webpack://TL/./src/js/core/Browser.js","webpack://TL/./src/js/dom/DOM.js","webpack://TL/./src/js/dom/DOMUtil.js","webpack://TL/./src/js/core/TLError.js","webpack://TL/./src/js/core/Util.js","webpack://TL/./src/js/animation/Ease.js","webpack://TL/./src/js/core/TLClass.js","webpack://TL/./src/js/core/Events.js","webpack://TL/./src/js/animation/Animate.js","webpack://TL/./src/js/dom/DOMMixins.js","webpack://TL/./src/js/ui/Draggable.js","webpack://TL/./src/js/dom/DOMEvent.js","webpack://TL/./src/js/net/Net.js","webpack://TL/./src/js/date/TLDate.js","webpack://TL/./src/js/language/Language.js","webpack://TL/./src/js/language/I18NMixins.js","webpack://TL/./src/js/ui/Message.js","webpack://TL/./src/js/date/DateUtil.js","webpack://TL/./src/js/core/TimelineConfig.js","webpack://TL/./src/js/core/CSV.js","webpack://TL/./src/js/core/ConfigFactory.js","webpack://TL/./src/js/timenav/AxisHelper.js","webpack://TL/./src/js/timenav/TimeScale.js","webpack://TL/./src/js/timenav/TimeGroup.js","webpack://TL/./src/js/timenav/TimeEra.js","webpack://TL/./src/js/timenav/TimeAxis.js","webpack://TL/./src/js/media/types/Text.js","webpack://TL/./src/js/media/Media.js","webpack://TL/./src/js/media/types/Image.js","webpack://TL/./src/js/core/Load.js","webpack://TL/./src/js/media/types/YouTube.js","webpack://TL/./src/js/media/types/GoogleMap.js","webpack://TL/./src/js/media/types/Blockquote.js","webpack://TL/./src/js/media/types/Wikipedia.js","webpack://TL/./src/js/media/types/SoundCloud.js","webpack://TL/./src/js/media/types/Vimeo.js","webpack://TL/./src/js/media/types/DailyMotion.js","webpack://TL/./src/js/media/types/Vine.js","webpack://TL/./src/js/media/types/Twitter.js","webpack://TL/./src/js/media/types/TwitterEmbed.js","webpack://TL/./src/js/media/types/Flickr.js","webpack://TL/./src/js/media/types/DocumentCloud.js","webpack://TL/./src/js/media/types/Instagram.js","webpack://TL/./src/js/media/types/Profile.js","webpack://TL/./src/js/media/types/GoogleDoc.js","webpack://TL/./src/js/media/types/Spotify.js","webpack://TL/./src/js/media/types/IFrame.js","webpack://TL/./src/js/media/types/Imgur.js","webpack://TL/./src/js/media/types/PDF.js","webpack://TL/./src/js/media/types/Audio.js","webpack://TL/./src/js/media/types/Video.js","webpack://TL/./src/js/media/types/Wistia.js","webpack://TL/./src/js/media/MediaType.js","webpack://TL/./src/js/timenav/TimeMarker.js","webpack://TL/./src/js/ui/Swipable.js","webpack://TL/./src/js/timenav/TimeNav.js","webpack://TL/./src/js/slider/Slide.js","webpack://TL/./src/js/slider/SlideNav.js","webpack://TL/./src/js/slider/StorySlider.js","webpack://TL/./src/js/ui/MenuBar.js","webpack://TL/./src/js/timeline/Timeline.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","_ref","Reflect","apply","construct","fun","thisValue","args","x","Func","Function","concat","arr","Array","isArray","arr2","length","from","_toConsumableArray","func","arrayForEach","unapply","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","TypeError","_len2","arguments","_key2","thisArg","_len","_key","addToSet","set","array","element","lcElement","clone","newObject","lookupGetter","prop","desc","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","html$1","svg$1","mathMl$1","xml","MUSTACHE_EXPR","ERB_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","_typeof","iterator","obj","constructor","_toConsumableArray$1","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","currentScript","hasAttribute","getAttribute","policyName","createHTML","html$$1","_","createDOMPurify","undefined","DOMPurify","root","version","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","_window$NamedNodeMap","NamedNodeMap","MozNamedAttrMap","Text","Comment","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","RETURN_TRUSTED_TYPE","_document","implementation","createNodeIterator","getElementsByTagName","createDocumentFragment","importNode","documentMode","hooks","createHTMLDocument","MUSTACHE_EXPR$$1","ERB_EXPR$$1","DATA_ATTR$$1","ARIA_ATTR$$1","IS_SCRIPT_OR_DATA$$1","ATTR_WHITESPACE$$1","IS_ALLOWED_URI$$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_DOM_IMPORT","SANITIZE_DOM","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","CONFIG","formElement","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","commonSvgAndHTMLElements","_forceRemove","node","parentNode","removeChild","outerHTML","remove","_removeAttribute","attribute","getAttributeNode","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","body","firstElementChild","insertBefore","createTextNode","childNodes","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","FILTER_ACCEPT","_isClobbered","elm","nodeName","textContent","attributes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","innerHTML","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","_attr","forceKeepAttr","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","oldNode","returnNode","toString","toStaticHTML","appendChild","firstChild","nodeIterator","serializedHTML","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","factory","ua","navigator","userAgent","phantomjs","ie","webkit","addEventListener","android23","search","mobile","orientation","msPointer","msPointerEnabled","msMaxTouchPoints","PointerEvent","pointer","pointerEnabled","maxTouchPoints","opera","firefox","edge","ie3d","style","webkit3d","WebKitCSSMatrix","gecko3d","opera3d","L_DISABLE_3D","retina","devicePixelRatio","media_matches","matchMedia","touch","L_NO_TOUCH","DocumentTouch","id","getElementById","className","container","el","getPosition","pos","y","isNaN","offsetLeft","offsetTop","offsetParent","testProp","props","addClass","hasClass","removeClass","w","TLError","Error","message_key","detail","super","this","message","css_named_colors","hexToRgb","hex","g","b","result","exec","parseInt","mergeData","data_main","data_to_merge","extend","dest","sources","slice","j","len","TRACE_HANDLERS","msg","cb","e","log","pad","val","stamp","lastId","str","classMixin","cls","src","_cl","getOwnPropertyNames","slugify","charAt","unique_ID","size","prefix","getRandomChar","range","substr","Math","floor","random","randomID","isEven","parseFloat","findArrayNumberByUniqueID","defaultVal","_n","unlinkify","unhtmlify","linkify","targets","is_touch","make_link","url","link_text","substring","url_sans_protocol","offset","string","prechar","beforePseudo","pseudoUrl","email","transformMediaURL","ratio","h","round","base58","base","alphabet","encode","enc","encoded","remainder","decode","dec","decoded","alphabetPosition","powerOf","pow","parseYouTubeTime","parts","hours","minutes","stripMarkup","txt","Easings","KeySpline","a","easeInSpline","easeOutStrong","easeInOutQuint","TLClass","NewClass","initialize","F","proto","superclass","statics","includes","options","include","type","fn","context","events","_tl_events","action","on","k","hasEventListeners","splice","removeEventListener","event","target","listeners","Animate","tlanimate","win","perf","performance","perfNow","now","webkitNow","msNow","mozNow","Date","fixTs","rgbOhex","relVal","numUnit","rotate","scale","skew","translate","unitless","lineHeight","zoom","zIndex","opacity","transform","styles","getStyle","defaultView","getComputedStyle","camelize","computed","currentStyle","filters","e1","e2","frame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","callback","setTimeout","children","render","timestamp","count","die","f","rest","index","elem","has","parseTransform","values","by","skewx","skewy","translatex","translatey","formatTransform","v","toHex","m1","toUpperCase","nativeTween","sin","PI","tween","duration","done","ease","to","morpheus","easings","time","self","diff","start","stop","end","run","delta","isFinite","jump","bezier","points","getTweenVal","units","begin","finish","min","join","nextColor","elements","originalLeft","originalTop","els","complete","easing","bez","left","top","right","bottom","xy","unshift","unit","tmp","filter","animate","_el","display","onAdd","onRemove","ani","animator","fire","drag_elem","move_elem","drag","move","mousedrag","down","up","leave","touchdrag","enable","constraint","momentum_multiplier","dragevent","sliding","direction","pagex","pagey","new_pos","new_pos_parent","position","DOMEvent","removeListener","_onDragStart","_onDragEnd","originalEvent","touches","screenX","screenY","targetTouches","pageX","pageY","offsetWidth","offsetHeight","getTime","addListener","_onDragMove","_momentum","preventDefault","pos_adjust","pos_change","swipe","abs","_animateMomentum","$","handler","_getEvent","addDoubleTapListener","originalHandler","newType","_checkMouse","attachEvent","removeDoubleTapListener","detachEvent","related","relatedTarget","err","caller","callee","Event","stopPropagation","cancelBubble","disableClickPropagation","START","returnValue","getWheelDelta","wheelDelta","Zepto","classList","uniq","emptyArray","elementDisplay","classCache","cssNumber","fragmentRE","singleTagRE","tagExpanderRE","rootNodeRE","capitalRE","methodAttributes","tableRow","containers","readyRE","simpleSelectorRE","class2type","zepto","tempParent","propMap","isFunction","isWindow","isDocument","DOCUMENT_NODE","isObject","isPlainObject","likeArray","dasherize","classRE","maybeAddPx","map","source","deep","filtered","nodes","selector","funcArg","arg","idx","payload","klass","baseVal","deserializeValue","num","Number","parseJSON","traverseNode","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","temp","qsa","chr","item","properties","dom","$1","each","Z","__proto__","isZ","init","find","ready","shift","found","maybeID","maybeClass","nameOnly","isSimple","getElementsByClassName","querySelectorAll","contains","isEmptyObject","inArray","camelCase","uuid","support","expr","grep","JSON","parse","split","reduce","sort","readyState","toArray","every","not","add","is","excludes","eq","first","last","$this","some","closest","collection","parents","ancestors","pluck","contents","siblings","child","empty","show","getPropertyValue","replaceWith","newContent","before","wrap","structure","wrapAll","append","wrapInner","unwrap","hide","css","toggle","setting","prev","next","originHtml","removeAttr","multiple","selected","coordinates","coords","parentOffset","getBoundingClientRect","pageXOffset","pageYOffset","width","height","computedStyle","removeProperty","cssText","toggleClass","when","scrollTop","hasScrollTop","scrollTo","scrollX","scrollLeft","hasScrollLeft","scrollY","detach","dimension","dimensionProperty","operator","operatorIndex","inside","argType","copyByClone","nextSibling","_zid","isString","handlers","specialEvents","focusinSupported","focus","blur","hover","mouseenter","mouseleave","zid","findHandlers","matcher","sel","eventCapture","captureSetting","del","realEvent","delegator","capture","proxy","compatible","isImmediatePropagationStopped","_args","click","mousedown","mouseup","mousemove","proxyFn","unbind","off","one","returnTrue","returnFalse","ignoreProperties","eventMethods","stopImmediatePropagation","isDefaultPrevented","predicate","sourceMethod","defaultPrevented","getPreventDefault","createProxy","delegate","undelegate","live","autoRemove","evt","currentTarget","liveFired","trigger","dispatchEvent","triggerHandler","createEvent","bubbles","initEvent","jsonpID","rscript","scriptTypeRE","xmlTypeRE","blankRE","triggerGlobal","settings","eventName","global","triggerAndReturn","ajaxBeforeSend","xhr","beforeSend","ajaxSuccess","deferred","success","resolveWith","ajaxComplete","ajaxError","error","rejectWith","status","active","ajaxStop","appendQuery","query","parseArguments","dataType","hasData","ajaxJSONP","ajax","responseData","abortTimeout","_callbackName","jsonpCallback","callbackName","script","originalCallback","abort","errorType","promise","clearTimeout","head","timeout","ajaxSettings","XMLHttpRequest","accepts","json","crossDomain","processData","cache","Deferred","ajaxStart","$2","location","host","param","traditional","serializeData","hasPlaceholder","jsonp","mime","headers","setHeader","protocol","nativeSetHeader","setRequestHeader","mimeType","overrideMimeType","contentType","onreadystatechange","mimeToDataType","getResponseHeader","responseText","eval","responseXML","statusText","xhrFields","async","open","username","password","send","post","getJSON","fetchJSON","request","Promise","resolve","reject","load","response","escape","encodeURIComponent","params","serialize","scope","hash","serializeArray","disabled","checked","submit","__Z","nativeGetComputedStyle","pseudoElement","SCALES","setMilliseconds","setSeconds","setMinutes","setHours","setDate","setMonth","real_year","getFullYear","setFullYear","DATE_PARTS","ISO8601_SHORT_PATTERN","ISO8601_PATTERN","BEST_DATEFORMATS","millisecond","second","minute","hour","day","month","year","decade","century","millennium","age","epoch","era","eon","eon2","short","TLDate","format","format_short","date_obj","stringify","_createDateObj","_setFormat","setDateFormat","getDisplayDate","language","display_date","fallback","format_key","formatDate","getMillisecond","isBefore","other_date","isAfter","_getDateData","_date","ix","parsed","findBestFormat","variant","eval_array","parseDate","parseISODate","date","date_parts","time_parts","second_parts","BigYear","that","Floorer","a_big_year","BIG_DATE_SCALES","AGE","EPOCH","ERA","BigDate","floored","script_path","LANGUAGES","en","code","buildLanguageURL","then","catch","resp","lang_json","bigyear","format_name","the_year","format_list","bigdateformats","tuple","formatNumber","messages","formatJSDate","formatBigYear","js_date","formatPeriod","fmt","formats","period_labels","mask","dateformats","D","H","M","L","getTimezoneOffset","flags","dd","ddd","day_abbr","dddd","mm","mmm","month_abbr","mmmm","yy","yyyy","has_negative_year_modifier","hh","HH","MM","ss","tt","T","TT","S","formatted","DATE_FORMAT_TOKENS","$0","_applyEra","era_labels","negative_year","formatted_date","original_year","labels","positive_year","token","toFixed","lang","api","wikipedia","loading","contract_timeline","return_to_title","loading_content","expand_timeline","loading_timeline","swipe_to_navigate","unknown_read_err","invalid_url_err","invalid_url_share_required","network_err","empty_feed_err","missing_start_date_err","invalid_data_format_err","invalid_start_time_without_date","invalid_end_time_without_date","date_compare_err","invalid_scale_err","invalid_date_err","invalid_separator_error","invalid_hour_err","invalid_minute_err","invalid_second_err","invalid_fractional_err","invalid_second_fractional_err","invalid_year_err","flickr_notfound_err","flickr_invalidurl_err","imgur_invalidurl_err","twitter_invalidurl_err","twitter_load_err","twitterembed_invalidurl_err","wikipedia_load_err","youtube_invalidurl_err","spotify_invalid_url","template_value_err","invalid_rgb_err","time_scale_scale_err","axis_helper_no_options_err","axis_helper_scale_err","invalid_integer_option","instagram_bad_request","month_short","full_short","full","time_short","time_no_seconds_short","time_no_minutes_short","time_no_seconds_small_date","time_milliseconds","full_long","full_long_small_date","compact","verbose","getLanguage","setLanguage","message_container","loading_icon","message_class","message_icon_class","_initLayout","_initEvents","atributes","updateMessage","_onMouseClick","_onRemove","sortByDate","prop_name","parseTime","time_str","period","lastIndexOf","no_separators","hour_part","minute_part","sec_parts","frac_secs","VALID_INTEGER_PATTERN","validDateConfig","keys","SCALE_DATE_CLASSES","human","cosmological","SANITIZE_FIELDS","media","STRIP_MARKUP_FIELDS","start_date","end_date","slide","_process_fields","fieldmap","to_sanitize","_tl_sanitize","rel","title","eras","event_dict","errors","warnings","_ensureValidScale","title_id","_assignID","_tidyFields","addEvent","logError","era_data","addEra","sep","era_identifier","headline","defer_sort","event_id","_processDates","slide_id","unique_id","candidate","similar_ids","counter","ensureUniqueKey","used","slug","slide_or_era","dateCls","equal","dates","fillIn","default_value","group","fetchCSV","dataset","out","extractFields","useMemoryStore","fetch","status_code","dialect","rows","objects","records","record","fields","parseObjects","noFields","noHeaderRow","lineterminator","csvString","normalizeLineTerminator","delimiter","doublequote","quotechar","skipinitialspace","skipinitialrows","normalizeDialectOptions","chomp","processField","cur","inQuote","fieldQuoted","field","row","clean_integer","parseGoogleSpreadsheetURL","worksheet","key_pat","url_pat","tail","readGoogleAsCSV","sheets_proxy","url_or_key","startsWith","URL","URLSearchParams","base_path","pathname","makeGoogleCSVURL","error_json","proxy_err_code","timeline_config","row_type","handleRow","orig_row","bkgd","caption","credit","thumbnail","background","extractEventFromCSVObject","label","makeConfig","callback_or_options","tc","google_url","timeline_json","jsonFromGoogleURL","minor","major","pixels_per_milli","factor","timescale","_getTicks","option","factor_scale","_scaled_padding","first_tick_time","_earliest","last_tick_time","_latest","ticks","getDateFromTime","HELPERS","setHelpers","scale_type","scales","AXIS_TICK_DATEFORMAT_LOOKUP","slides","_scale","display_width","screen_multiplier","max_rows","_display_width","_screen_multiplier","_pixel_width","_group_labels","_positions","_pixels_per_milli","getEarliestDate","getLatestDate","_span_in_millis","_computeDefaultSpan","_average","getPixelWidth","_axis_helper","ts","optimal_tick_width","ts_scale","getScale","helpers","curr","pixels_per_tick","getPixelsPerTick","getBestHelper","_computePositionInfo","_number_of_rows","time_in_millis","getMajorTicks","getMinorTicks","groups","empty_group","positions","rows_left","lasts_in_row","n_overlaps","pos_info","overlaps","min_overlap","n_rows","default_marker_width","end_pos","group_info","gi","max","res","_computeRowInfo","row_offset","setPosition","alternate","class_name","content_container","_text","_state","loaded","marker_width_min","has_end_date","is_active","_updateDisplay","text_lines","webkitLineClamp","color_num","onLoaded","layout","axis_helper","minor_ticks","major_ticks","getTicks","_createTickElements","getAxisTickDateFormat","positionTicks","ts_ticks","tick_element","dateformat","ticks_to_skip","skip_times","tick_elements","ts_tick","tick","tick_text","tick_display_date","no_animate","_positionTickArray","tick_array","fraction_of_array","add_to_container","setData","headline_class","text_content","autolink","content_item","content_link","link","player","timer","load_timer","media_id","show_meta","media_loaded","credit_alternate","caption_alternate","link_target","api_key_flickr","api_key_googlemaps","api_key_embedly","credit_height","caption_height","loadingMessage","_loadMedia","trace","_media","_updateMessage","media_name","maxHeight","maxWidth","_updateMediaDisplay","_getImageURL","_stopMedia","media_type","showMeta","updateDisplay","getMeta","_getMeta","href","updateMediaDisplay","createMedia","image_class","domCreate","alt","onMediaLoaded","getImageURL","loadJS","urls","loader","js","loadCSS","pending","queue","styleSheets","env","getEnv","pollCount","attrs","gecko","unknown","pendingUrls","_finish","isCSS","createNode","pollWebKit","pollGecko","onload","onerror","hasRules","sheet","cssRules","ex","url_vars","youtube_loaded","hashes","vars","getUrlVars","hd","getPlayerState","YT","PlayerState","PLAYING","pauseVideo","Player","playerVars","enablejsapi","color","controls","fs","videoId","onReady","onPlayerReady","onStateChange","ENDED","seekTo","mapframe","frameBorder","makeGoogleMapsEmbedURL","dimensions","api_key","Streetview","param_defs","root_url_regex","coords_regex","address_regex","display_mode_regex","regexes","view","place","directions","parseDisplayMode","display_mode","param_string","mapmode","center","streetview_params","url_root","getParamString","determineMapModeURL","determineMapMode","blockquote","api_url","error_text","loadErrorDisplay","wiki","entry","extract","paragraphs","page_image","text_array","getObjectAttributeByIndex","pages","widget","SC","Widget","querySelector","soundCloudCreated","pause","start_time","contentWindow","postMessage","method","tweetuser","tweet_status_url","tweet_status_date","tweet","tweet_text","tweet_status_temp","author_url","twttr","widgets","createTweet","conversation","linkColor","theme","author_name","fjs","_e","mediaID","establishMediaID","stat","sizes","best_size","size_label","photo","owner","realname","_content","description","updateMeta","_transformURL","DV","showSidebar","API_URL_ROOT","successHandler","oembed_response","thumbnail_url","errorHandler","data_url","_height","_player_height","_player_width","iframe","setInterval","clearInterval","imgurEmbed","createIframe","markup","source_item","_getType","mediatype","match_str","player_element","reg","lookupMediaType","image_only","media_types","media_container","timespan","line_left","line_right","loadMedia","stopMedia","timespan_content","mtd","thumbnail_media_type","thumbnail_media","_onMarkerClick","snap","change","swipe_detect","slider","slider_background","line","marker_container_mask","marker_container","marker_item_container","timeaxis","timeaxis_background","attribution","collapsed","config","has_groups","scale_factor","marker_padding","timenav_height_min","marker_height_min","zoom_sequence","_markers","_eras","has_eras","_groups","_calculated_row_height","current_id","animate_css","_swipable","_initData","_onLoaded","fast","getPositionInfo","setClass","setWidth","reposition_markers","_getTimeScale","_assignRowsToMarkers","updateConstraint","_drawTimeline","goToId","new_scale","_updateDrawTimeline","list","current","findNextGreater","setZoomFactor","findNextLesser","level","zoom_factor","group_labels","getGroupLabels","_createGroup","group_label","_addGroup","addTo","available_height","group_height","getNumberOfRows","group_rows","group_y","group_hide","setRowPosition","setAlternateRowColor","marker","_onMarkerAdded","_addMarker","_createMarker","removeFrom","_removeMarker","_calculateMinimumTimeNavHeight","_calculateAvailableHeight","marker_height","_calculateMarkerHeight","_positionGroups","_calculateRowHeight","setHeight","marker_y","remainder_height","setActive","_onEraAdded","era_color","setColor","_createMarkers","_destroyMarker","destroyMarker","_findMarkerIndex","css_animation","_ease","_duration","_resetMarkersActive","getLeft","goTo","scroll_to","wheelDeltaX","wheelDeltaY","drawTicks","positionMarkers","_createGroups","_positionEras","check_update","do_update","temp_timescale","getMajorScale","getMinorScale","_onMouseScroll","_createEras","title_slide","scroll_container","_mediaclass","_background_media","image","color_value","slide_padding_lr","skinny_size","slider_container","content_width","content_padding_left","content_padding_right","paddingLeft","paddingRight","headlineHeight","_updateBackgroundDisplay","date_text","text_background","addDateText","getFormattedDate","backgroundImage","icon","_update","inverted","slider_container_mask","slider_item_container","_nav","previous","slide_spacing","_slides","preloadTimer","_message","default_bg_color","start_at_slide","slide_default_fade","dragging","trackResize","_onSlideAdded","_onBackgroundChange","_addSlide","_createSlide","_onSlideRemoved","_removeSlide","nav_pos","_layout","_createSlides","_destroySlide","destroySlide","_findSlideIndex","displayupdate","changeBackground","stopMomentum","_onSlideChange","showNav","update","preloadSlides","scrollToTop","nav_obj","bg","bg_color","backgroundColor","_onNavigation","_onMessageClick","_onSwipeNoDirection","slide_background","getBackground","_loaded","latlng","layerPoint","parent_elem","button_backtostart","button_zoomin","button_zoomout","arrow","coverbar","grip","menubar_default_y","_onButtonBackToStart","_onButtonZoomIn","_onButtonZoomOut","script_src_url","script_tags","storyslider","timenav","menubar","_storyslider","_timenav","_menubar","debug","font","is_embed","is_full_embed","hash_bookmark","timenav_position","base_class","timenav_height","timenav_height_percentage","timenav_mobile_height_percentage","start_at_end","menubar_height","medium_size","use_bc","map_type","ga_property_id","track_events","soundcite","animator_timenav","animator_storyslider","animator_menubar","timeline","determineScriptPath","_loadStyles","keyName","currentSlide","_getSlideIndex","lastSlide","goToPrev","goToNext","_loadLanguage","font_css_url","theme_css_url","language_code","loadLanguage","showMessage","_translateError","stack","script_tag","isValid","validate","_validateOptions","_onDataLoaded","translated_errs","errs","getErrors","_initAnalytics","IntersectionObserver","entries","observer","accum","isIntersecting","observe","_calculateTimeNavHeight","_onTimeNavLoaded","initial_zoom","setZoom","_onStorySliderLoaded","storyslider_height","_onTimeNavChange","_onZoomToggle","_onColorChange","_onStorySliderNext","_onStorySliderPrevious","_onZoomIn","_onZoomOut","_onBackToStart","_onChange","toogleZoomIn","toogleZoomOut","_updateHashBookmark","zoomIn","zoom_level","zoomOut","_orientation","display_class","menu_position","innerWidth","innerHeight","ceil","getMinimumHeight","INTEGER_PROPERTIES","opt","valid","goToEnd","the_timeline","history","replaceState","hashbookmark","_getEventIndex","createSlide","_updateDrawSlides","createMarker","getData","getSlide","getSlideById","q","ga","_initGoogleAnalytics","event_"],"mappings":"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D,UAAW,sCACXtsC,IAAK,IAET,CACI4E,KAAM,OACNvd,KAAM,OACNilD,UAAW,8BACXtsC,IAAK,IAET,CACI4E,KAAM,aACNvd,KAAM,aACNilD,UAAW,wCACXtsC,IAAK,IAET,CACI4E,KAAM,UACNvd,KAAM,UACNilD,UAAW,kCACXtsC,IAAK,IAET,CACI4E,KAAM,eACNvd,KAAM,eACNilD,UAAW,4CACXtsC,IAAK,IAET,CACI4E,KAAM,aACNvd,KAAM,aACNilD,UAAW,8TACXtsC,IAAK,IAET,CACI4E,KAAM,SACNvd,KAAM,SACNilD,UAAW,wCACXtsC,IAAK,IAET,CACI4E,KAAM,SACNvd,KAAM,SACNilD,UAAW,0BACXtsC,IAAK,IAET,CACI4E,KAAM,YACNvd,KAAM,YACNilD,UAAW,4EACXtsC,IAAK,IAET,CACI4E,KAAM,UACNvd,KAAM,UACNilD,UAAW,uGACXtsC,IAAK,IAET,CACI4E,KAAM,gBACNvd,KAAM,iBACNilD,UAAW,sBACXtsC,IAAK,IAET,CACI4E,KAAM,QACNvd,KAAM,QACNilD,UAAW,uCACXtsC,IAAK,IAET,CACI4E,KAAM,QACNvd,KAAM,QACNilD,UAAW,iEACXtsC,IAAK,IAET,CACI4E,KAAM,aACNvd,KAAM,aACNilD,UAAW,qNACXtsC,IAAK,IAET,CACI4E,KAAM,MACNvd,KAAM,MACNilD,UAAW,yBACXtsC,IAAK,IAET,CACI4E,KAAM,YACNvd,KAAM,YACNilD,UAAW,6EACXtsC,IAAK,IAET,CACI4E,KAAM,UACNvd,KAAM,UACNilD,UAAW,UACXtsC,IAAK,IAET,CACI4E,KAAM,SACNvd,KAAM,SACNilD,UAAW,SACXtsC,IAAK,IAET,CACI4E,KAAM,aACNvd,KAAM,QACNilD,UAAW,aACXtsC,IAAK,IAET,CACI4E,KAAM,QACNvd,KAAM,QACNilD,UAAW,sBACXtsC,IAAK,IAET,CACI4E,KAAM,SACNvd,KAAM,SACNilD,UAAW,4CACXtsC,IAAK,IAET,CACI4E,KAAM,QACNvd,KAAM,QACNilD,UAAW,yBACXtsC,IAAK,IAET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","file":"timeline.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","/*! @license DOMPurify | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.2.2/LICENSE */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.DOMPurify = factory());\n}(this, function () { 'use strict';\n\n function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n var hasOwnProperty = Object.hasOwnProperty,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\n\n var _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\n\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n\n if (!construct) {\n construct = function construct(Func, args) {\n return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray(args))))();\n };\n }\n\n var arrayForEach = unapply(Array.prototype.forEach);\n var arrayPop = unapply(Array.prototype.pop);\n var arrayPush = unapply(Array.prototype.push);\n\n var stringToLowerCase = unapply(String.prototype.toLowerCase);\n var stringMatch = unapply(String.prototype.match);\n var stringReplace = unapply(String.prototype.replace);\n var stringIndexOf = unapply(String.prototype.indexOf);\n var stringTrim = unapply(String.prototype.trim);\n\n var regExpTest = unapply(RegExp.prototype.test);\n\n var typeErrorCreate = unconstruct(TypeError);\n\n function unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return apply(func, thisArg, args);\n };\n }\n\n function unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return construct(func, args);\n };\n }\n\n /* Add properties to a lookup table */\n function addToSet(set, array) {\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n var l = array.length;\n while (l--) {\n var element = array[l];\n if (typeof element === 'string') {\n var lcElement = stringToLowerCase(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n }\n\n /* Shallow clone an object */\n function clone(object) {\n var newObject = create(null);\n\n var property = void 0;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n }\n\n /* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n }\n\n var html = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n\n // SVG\n var svg = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n\n var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n\n // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'feimage', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n\n var mathMl = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']);\n\n // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n\n var text = freeze(['#text']);\n\n var html$1 = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns']);\n\n var svg$1 = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n\n var mathMl$1 = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n\n var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n // eslint-disable-next-line unicorn/better-regex\n var MUSTACHE_EXPR = seal(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n var ERB_EXPR = seal(/<%[\\s\\S]*|[\\s\\S]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\n var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n );\n\n var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n function _toConsumableArray$1(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if ((typeof trustedTypes === 'undefined' ? 'undefined' : _typeof(trustedTypes)) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html$$1) {\n return html$$1;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = '2.2.7';\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n var originalDocument = window.document;\n\n var document = window.document;\n var DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === undefined ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n Text = window.Text,\n Comment = window.Comment,\n DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\n\n\n var ElementPrototype = Element.prototype;\n\n var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n var getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n var emptyHTML = trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML('') : '';\n\n var _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n getElementsByTagName = _document.getElementsByTagName,\n createDocumentFragment = _document.createDocumentFragment;\n var importNode = originalDocument.importNode;\n\n\n var documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n var hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n\n var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR,\n ERB_EXPR$$1 = ERB_EXPR,\n DATA_ATTR$$1 = DATA_ATTR,\n ARIA_ATTR$$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n\n var ALLOWED_TAGS = null;\n var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(html), _toConsumableArray$1(svg), _toConsumableArray$1(svgFilters), _toConsumableArray$1(mathMl), _toConsumableArray$1(text)));\n\n /* Allowed attribute names */\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray$1(html$1), _toConsumableArray$1(svg$1), _toConsumableArray$1(mathMl$1), _toConsumableArray$1(xml)));\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n var FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n var FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n var ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n var ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n var SAFE_FOR_TEMPLATES = false;\n\n /* Decide if document with <html>... should be returned */\n var WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n var SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n var FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n var RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n var RETURN_DOM_FRAGMENT = false;\n\n /* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM\n * `Node` is imported into the current `Document`. If this flag is not enabled the\n * `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by\n * DOMPurify.\n *\n * This defaults to `true` starting DOMPurify 2.2.0. Note that setting it to `false`\n * might cause XSS from attacks hidden in closed shadowroots in case the browser\n * supports Declarative Shadow: DOM https://web.dev/declarative-shadow-dom/\n */\n var RETURN_DOM_IMPORT = true;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n var RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks? */\n var SANITIZE_DOM = true;\n\n /* Keep element content when removing element? */\n var KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n var IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n var USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n var FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n\n /* Tags that are safe for data: URIs */\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n\n /* Attributes safe for values like \"javascript:\" */\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'summary', 'title', 'value', 'style', 'xmlns']);\n\n /* Keep a reference to config to pass to hooks */\n var CONFIG = null;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n var formElement = document.createElement('form');\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || (typeof cfg === 'undefined' ? 'undefined' : _typeof(cfg)) !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n /* Set configuration parameters */\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT !== false; // Default true\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1;\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(text)));\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html);\n addToSet(ALLOWED_ATTR, html$1);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg);\n addToSet(ALLOWED_ATTR, svg$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl);\n addToSet(ALLOWED_ATTR, mathMl$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n\n var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n var ALL_SVG_TAGS = addToSet({}, svg);\n addToSet(ALL_SVG_TAGS, svgFilters);\n addToSet(ALL_SVG_TAGS, svgDisallowed);\n\n var ALL_MATHML_TAGS = addToSet({}, mathMl);\n addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n\n var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erronously deleted from\n // HTML namespace.\n var commonSvgAndHTMLElements = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (commonSvgAndHTMLElements[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n var _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n var _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n var doc = void 0;\n var leadingWhitespace = void 0;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /* Use the DOMParser API by default, fallback later if needs be */\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, 'text/html');\n } catch (_) {}\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createHTMLDocument('');\n var _doc = doc,\n body = _doc.body;\n\n body.parentNode.removeChild(body.parentNode.firstElementChild);\n body.outerHTML = dirtyPayload;\n }\n\n if (dirty && leadingWhitespace) {\n doc.body.insertBefore(document.createTextNode(leadingWhitespace), doc.body.childNodes[0] || null);\n }\n\n /* Work on whole document or just its body */\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, function () {\n return NodeFilter.FILTER_ACCEPT;\n }, false);\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n var _isClobbered = function _isClobbered(elm) {\n if (elm instanceof Text || elm instanceof Comment) {\n return false;\n }\n\n if (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function') {\n return true;\n }\n\n return false;\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n var _isNode = function _isNode(object) {\n return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === 'object' ? object instanceof Node : object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content = void 0;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (stringMatch(currentNode.nodeName, /[\\u0080-\\uFFFF]/)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n var tagName = stringToLowerCase(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (!_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove element if anything forbids its presence */\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n var parentNode = getParentNode(currentNode);\n var childNodes = getChildNodes(currentNode);\n\n if (childNodes && parentNode) {\n var childCount = childNodes.length;\n\n for (var i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n }\n }\n }\n\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR$$1, ' ');\n content = stringReplace(content, ERB_EXPR$$1, ' ');\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n currentNode.textContent = content;\n }\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n return false;\n\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$$1, stringReplace(value, ATTR_WHITESPACE$$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$$1, stringReplace(value, ATTR_WHITESPACE$$1, ''))) ; else if (!value) ; else {\n return false;\n }\n\n return true;\n };\n\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n var attr = void 0;\n var value = void 0;\n var lcName = void 0;\n var l = void 0;\n /* Execute a hook if present */\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n var attributes = currentNode.attributes;\n\n /* Check if we have attributes; if not we might have a text node */\n\n if (!attributes) {\n return;\n }\n\n var hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n l = attributes.length;\n\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n attr = attributes[l];\n var _attr = attr,\n name = _attr.name,\n namespaceURI = _attr.namespaceURI;\n\n value = stringTrim(attr.value);\n lcName = stringToLowerCase(name);\n\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n\n /* Remove attribute */\n _removeAttribute(name, currentNode);\n\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n continue;\n }\n\n /* Work around a security issue in jQuery 3.0 */\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR$$1, ' ');\n value = stringReplace(value, ERB_EXPR$$1, ' ');\n }\n\n /* Is `value` valid for this attribute? */\n var lcTag = currentNode.nodeName.toLowerCase();\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n\n /* Handle invalid data-* attribute set by try-catching it */\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n var shadowNode = void 0;\n var shadowIterator = _createIterator(fragment);\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(shadowNode);\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty, cfg) {\n var body = void 0;\n var importedNode = void 0;\n var currentNode = void 0;\n var oldNode = void 0;\n var returnNode = void 0;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n if (!dirty) {\n dirty = '<!-->';\n }\n\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n\n /* Check we can run. Otherwise fall back or ignore */\n if (!DOMPurify.isSupported) {\n if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n\n /* Clean up removed elements */\n DOMPurify.removed = [];\n\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) ; else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : emptyHTML;\n }\n }\n\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n\n /* Get node iterator */\n var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (RETURN_DOM_IMPORT) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$$1, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR$$1, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n var lcTag = stringToLowerCase(tag);\n var lcName = stringToLowerCase(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n */\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n arrayPop(hooks[entryPoint]);\n }\n };\n\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n }\n\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n","/*\n\tBased on Leaflet Browser\n*/\n\nexport const ua = navigator ? navigator.userAgent.toLowerCase() : 'no-user-agent-specified';\n\nconst doc = document ? document.documentElement : null;\nconst phantomjs = ua ? ua.indexOf(\"phantom\") !== -1 : false;\n\n\nexport const ie = window && 'ActiveXObject' in window\n\nexport const ie9 = Boolean(ie && ua.match(/MSIE 9/i))\nexport const ielt9 = ie && document && !document.addEventListener\n\nexport const webkit = ua.indexOf('webkit') !== -1\nexport const android = ua.indexOf('android') !== -1\n\nexport const android23 = ua.search('android [23]') !== -1\nexport const mobile = (window) ? typeof window.orientation !== 'undefined' : false\nexport const msPointer = (navigator && window) ? navigator.msPointerEnabled && navigator.msMaxTouchPoints && !window.PointerEvent : false\nexport const pointer = (navigator && window) ? (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) : msPointer\n\nexport const opera = window ? window.opera : false;\n\nexport const gecko = ua.indexOf(\"gecko\") !== -1 && !webkit && !opera && !ie;\nexport const firefox = ua.indexOf(\"gecko\") !== -1 && !webkit && !opera && !ie;\nexport const chrome = ua.indexOf(\"chrome\") !== -1;\nexport const edge = ua.indexOf(\"edge/\") !== -1;\n\nexport const ie3d = (doc) ? ie && 'transition' in doc.style : false\nexport const webkit3d = (window) ? ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23 : false\nexport const gecko3d = (doc) ? 'MozPerspective' in doc.style : false\nexport const opera3d = (doc) ? 'OTransition' in doc.style : false\n\nexport const any3d = window && !window.L_DISABLE_3D &&\n (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs\n\nexport const mobileWebkit = mobile && webkit\nexport const mobileWebkit3d = mobile && webkit3d\nexport const mobileOpera = mobile && window.opera\n\nexport let retina = (window) ? 'devicePixelRatio' in window && window.devicePixelRatio > 1 : false\n\nif (!retina && window && 'matchMedia' in window) {\n let media_matches = window.matchMedia('(min-resolution:144dpi)');\n retina = media_matches && media_matches.matches;\n}\n\nexport const touch = window &&\n !window.L_NO_TOUCH &&\n !phantomjs &&\n (pointer || 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch))\n\n\nexport function orientation() {\n var w = window.innerWidth,\n h = window.innerHeight,\n _orientation = \"portrait\";\n\n if (w > h) {\n _orientation = \"landscape\";\n }\n if (Math.abs(window.orientation) == 90) {\n //_orientation = \"landscape\";\n }\n return _orientation;\n}","import * as Browser from \"../core/Browser\"\n\nfunction get (id) {\n\treturn (typeof id === 'string' ? document.getElementById(id) : id);\n}\n\nfunction getByClass(id) {\n\tif (id) {\n\t\treturn document.getElementsByClassName(id);\n\t}\n}\n\nfunction create(tagName, className, container) {\n\tvar el = document.createElement(tagName);\n\tel.className = className;\n\tif (container) {\n\t\tcontainer.appendChild(el);\n\t}\n\treturn el;\n}\n\nfunction createText(content, container) {\n\tvar el = document.createTextNode(content);\n\tif (container) {\n\t\tcontainer.appendChild(el);\n\t}\n\treturn el;\n}\n\nfunction getTranslateString(point) {\n\treturn TRANSLATE_OPEN +\n\t\t\tpoint.x + 'px,' + point.y + 'px' +\n\t\t\tTRANSLATE_CLOSE;\n}\n\nfunction setPosition(el, point) {\n\tel._tl_pos = point;\n\tif (Browser.webkit3d) {\n\t\tel.style[TRANSFORM] = getTranslateString(point);\n\n\t\tif (Browser.android) {\n\t\t\tel.style['-webkit-perspective'] = '1000';\n\t\t\tel.style['-webkit-backface-visibility'] = 'hidden';\n\t\t}\n\t} else {\n\t\tel.style.left = point.x + 'px';\n\t\tel.style.top = point.y + 'px';\n\t}\n}\n\nfunction getPosition(el){\n\tvar pos = {\n\t\tx: 0,\n\t\ty: 0\n\t}\n\twhile( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n\t\tpos.x += el.offsetLeft// - el.scrollLeft;\n\t\tpos.y += el.offsetTop// - el.scrollTop;\n\t\tel = el.offsetParent;\n\t}\n\treturn pos;\n}\n\nfunction testProp(props) {\n\tvar style = document.documentElement.style;\n\n\tfor (var i = 0; i < props.length; i++) {\n\t\tif (props[i] in style) {\n\t\t\treturn props[i];\n\t\t}\n\t}\n\treturn false;\n}\n\nlet TRANSITION = testProp(['transition', 'webkitTransition', 'OTransition', 'MozTransition', 'msTransition'])\nlet TRANSFORM = testProp(['transformProperty', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'])\n\nlet TRANSLATE_OPEN = 'translate' + (Browser.webkit3d ? '3d(' : '(')\nlet TRANSLATE_CLOSE = Browser.webkit3d ? ',0)' : ')'\n\nexport { get, create, getPosition }","/*\tDomUtil\n\tInspired by Leaflet\n\tDomUtil contains various utility functions for working with DOM\n\tWhy are they in DOMUtil and not DOM? \n================================================== */\n\nfunction hasClass(el, name) {\n\treturn (el.className.length > 0) &&\n\t\t\tnew RegExp(\"(^|\\\\s)\" + name + \"(\\\\s|$)\").test(el.className);\n}\n\nexport function addClass(el, name) {\n\tif (!hasClass(el, name)) {\n\t\tel.className += (el.className ? ' ' : '') + name;\n\t}\n}\n\nexport function removeClass(el, name) {\n\tel.className = el.className.replace(/(\\S+)\\s*/g, function (w, match) {\n\t\tif (match === name) {\n\t\t\treturn '';\n\t\t}\n\t\treturn w;\n\t}).replace(/^\\s+/, '');\n}\n","/* Timeline Error class */\nexport default class TLError extends Error {\n constructor(message_key, detail) {\n super()\n this.name = 'TLError';\n this.message = message_key || 'error';\n this.message_key = this.message;\n this.detail = detail || '';\n }\n}\n","import TLError from \"../core/TLError\"\n\nconst css_named_colors = {\n \"aliceblue\": \"#f0f8ff\",\n \"antiquewhite\": \"#faebd7\",\n \"aqua\": \"#00ffff\",\n \"aquamarine\": \"#7fffd4\",\n \"azure\": \"#f0ffff\",\n \"beige\": \"#f5f5dc\",\n \"bisque\": \"#ffe4c4\",\n \"black\": \"#000000\",\n \"blanchedalmond\": \"#ffebcd\",\n \"blue\": \"#0000ff\",\n \"blueviolet\": \"#8a2be2\",\n \"brown\": \"#a52a2a\",\n \"burlywood\": \"#deb887\",\n \"cadetblue\": \"#5f9ea0\",\n \"chartreuse\": \"#7fff00\",\n \"chocolate\": \"#d2691e\",\n \"coral\": \"#ff7f50\",\n \"cornflowerblue\": \"#6495ed\",\n \"cornsilk\": \"#fff8dc\",\n \"crimson\": \"#dc143c\",\n \"cyan\": \"#00ffff\",\n \"darkblue\": \"#00008b\",\n \"darkcyan\": \"#008b8b\",\n \"darkgoldenrod\": \"#b8860b\",\n \"darkgray\": \"#a9a9a9\",\n \"darkgreen\": \"#006400\",\n \"darkkhaki\": \"#bdb76b\",\n \"darkmagenta\": \"#8b008b\",\n \"darkolivegreen\": \"#556b2f\",\n \"darkorange\": \"#ff8c00\",\n \"darkorchid\": \"#9932cc\",\n \"darkred\": \"#8b0000\",\n \"darksalmon\": \"#e9967a\",\n \"darkseagreen\": \"#8fbc8f\",\n \"darkslateblue\": \"#483d8b\",\n \"darkslategray\": \"#2f4f4f\",\n \"darkturquoise\": \"#00ced1\",\n \"darkviolet\": \"#9400d3\",\n \"deeppink\": \"#ff1493\",\n \"deepskyblue\": \"#00bfff\",\n \"dimgray\": \"#696969\",\n \"dodgerblue\": \"#1e90ff\",\n \"firebrick\": \"#b22222\",\n \"floralwhite\": \"#fffaf0\",\n \"forestgreen\": \"#228b22\",\n \"fuchsia\": \"#ff00ff\",\n \"gainsboro\": \"#dcdcdc\",\n \"ghostwhite\": \"#f8f8ff\",\n \"gold\": \"#ffd700\",\n \"goldenrod\": \"#daa520\",\n \"gray\": \"#808080\",\n \"green\": \"#008000\",\n \"greenyellow\": \"#adff2f\",\n \"honeydew\": \"#f0fff0\",\n \"hotpink\": \"#ff69b4\",\n \"indianred\": \"#cd5c5c\",\n \"indigo\": \"#4b0082\",\n \"ivory\": \"#fffff0\",\n \"khaki\": \"#f0e68c\",\n \"lavender\": \"#e6e6fa\",\n \"lavenderblush\": \"#fff0f5\",\n \"lawngreen\": \"#7cfc00\",\n \"lemonchiffon\": \"#fffacd\",\n \"lightblue\": \"#add8e6\",\n \"lightcoral\": \"#f08080\",\n \"lightcyan\": \"#e0ffff\",\n \"lightgoldenrodyellow\": \"#fafad2\",\n \"lightgray\": \"#d3d3d3\",\n \"lightgreen\": \"#90ee90\",\n \"lightpink\": \"#ffb6c1\",\n \"lightsalmon\": \"#ffa07a\",\n \"lightseagreen\": \"#20b2aa\",\n \"lightskyblue\": \"#87cefa\",\n \"lightslategray\": \"#778899\",\n \"lightsteelblue\": \"#b0c4de\",\n \"lightyellow\": \"#ffffe0\",\n \"lime\": \"#00ff00\",\n \"limegreen\": \"#32cd32\",\n \"linen\": \"#faf0e6\",\n \"magenta\": \"#ff00ff\",\n \"maroon\": \"#800000\",\n \"mediumaquamarine\": \"#66cdaa\",\n \"mediumblue\": \"#0000cd\",\n \"mediumorchid\": \"#ba55d3\",\n \"mediumpurple\": \"#9370db\",\n \"mediumseagreen\": \"#3cb371\",\n \"mediumslateblue\": \"#7b68ee\",\n \"mediumspringgreen\": \"#00fa9a\",\n \"mediumturquoise\": \"#48d1cc\",\n \"mediumvioletred\": \"#c71585\",\n \"midnightblue\": \"#191970\",\n \"mintcream\": \"#f5fffa\",\n \"mistyrose\": \"#ffe4e1\",\n \"moccasin\": \"#ffe4b5\",\n \"navajowhite\": \"#ffdead\",\n \"navy\": \"#000080\",\n \"oldlace\": \"#fdf5e6\",\n \"olive\": \"#808000\",\n \"olivedrab\": \"#6b8e23\",\n \"orange\": \"#ffa500\",\n \"orangered\": \"#ff4500\",\n \"orchid\": \"#da70d6\",\n \"palegoldenrod\": \"#eee8aa\",\n \"palegreen\": \"#98fb98\",\n \"paleturquoise\": \"#afeeee\",\n \"palevioletred\": \"#db7093\",\n \"papayawhip\": \"#ffefd5\",\n \"peachpuff\": \"#ffdab9\",\n \"peru\": \"#cd853f\",\n \"pink\": \"#ffc0cb\",\n \"plum\": \"#dda0dd\",\n \"powderblue\": \"#b0e0e6\",\n \"purple\": \"#800080\",\n \"rebeccapurple\": \"#663399\",\n \"red\": \"#ff0000\",\n \"rosybrown\": \"#bc8f8f\",\n \"royalblue\": \"#4169e1\",\n \"saddlebrown\": \"#8b4513\",\n \"salmon\": \"#fa8072\",\n \"sandybrown\": \"#f4a460\",\n \"seagreen\": \"#2e8b57\",\n \"seashell\": \"#fff5ee\",\n \"sienna\": \"#a0522d\",\n \"silver\": \"#c0c0c0\",\n \"skyblue\": \"#87ceeb\",\n \"slateblue\": \"#6a5acd\",\n \"slategray\": \"#708090\",\n \"snow\": \"#fffafa\",\n \"springgreen\": \"#00ff7f\",\n \"steelblue\": \"#4682b4\",\n \"tan\": \"#d2b48c\",\n \"teal\": \"#008080\",\n \"thistle\": \"#d8bfd8\",\n \"tomato\": \"#ff6347\",\n \"turquoise\": \"#40e0d0\",\n \"violet\": \"#ee82ee\",\n \"wheat\": \"#f5deb3\",\n \"white\": \"#ffffff\",\n \"whitesmoke\": \"#f5f5f5\",\n \"yellow\": \"#ffff00\",\n \"yellowgreen\": \"#9acd32\"\n}\n\nfunction intToHexString(i) {\n return pad(parseInt(i, 10).toString(16));\n}\n\nexport function hexToRgb(hex) {\n // Expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\n if (css_named_colors[hex.toLowerCase()]) {\n hex = css_named_colors[hex.toLowerCase()];\n }\n var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n hex = hex.replace(shorthandRegex, function(m, r, g, b) {\n return r + r + g + g + b + b;\n });\n\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n// given an object with r, g, and b keys, or a string of the form 'rgb(mm,nn,ll)', return a CSS hex string including the leading '#' character\nexport function rgbToHex(rgb) {\n var r, g, b;\n if (typeof(rgb) == 'object') {\n r = rgb.r;\n g = rgb.g;\n b = rgb.b;\n } else if (typeof(rgb.match) == 'function') {\n var parts = rgb.match(/^rgb\\((\\d+),(\\d+),(\\d+)\\)$/);\n if (parts) {\n r = parts[1];\n g = parts[2];\n b = parts[3];\n }\n }\n if (isNaN(r) || isNaN(b) || isNaN(g)) {\n throw new TLError(\"invalid_rgb_err\");\n }\n return \"#\" + intToHexString(r) + intToHexString(g) + intToHexString(b);\n}\n\nexport function mergeData(data_main, data_to_merge) {\n var x;\n for (x in data_to_merge) {\n if (Object.prototype.hasOwnProperty.call(data_to_merge, x)) {\n data_main[x] = data_to_merge[x];\n }\n }\n return data_main;\n}\n\nexport function isTrue(s) {\n if (s == null) return false;\n return s == true || String(s).toLowerCase() == 'true' || Number(s) == 1;\n}\n\n// like mergeData but takes an arbitrarily long list of sources to merge.\nexport function extend( /*Object*/ dest) /*-> Object*/ { // merge src properties into dest\n var sources = Array.prototype.slice.call(arguments, 1);\n for (var j = 0, len = sources.length, src; j < len; j++) {\n src = sources[j] || {};\n mergeData(dest, src);\n }\n return dest;\n}\n\nconst TRACE_HANDLERS = []\n\n/**\n * Register a callback to be executed when trace is called in this runtime.\n * Callbacks will be called with whatever was passed to `trace` which is \n * expected to be a string.\n * @param {callable} cb \n */\nexport function addTraceHandler(cb) {\n TRACE_HANDLERS.push(cb)\n}\n\n\n/**\n * Pass the given `msg` to each registered trace handler.\n * This is a crude adaptation of the original Timeline trace\n * function which assumed access to a global `debug` flag.\n * \n * @param {string} msg \n */\nexport function trace(msg) {\n TRACE_HANDLERS.forEach((cb) => {\n try {\n cb(msg)\n } catch (e) {\n if (console && console.log) {\n console.log(\"Error handling trace\", e)\n }\n }\n })\n}\n\n\nexport function pad(val, len) {\n val = String(val);\n len = len || 2;\n while (val.length < len) val = \"0\" + val;\n return val;\n}\n\nexport const stamp = (function() {\n var lastId = 0,\n key = '_tl_id';\n\n return function( /*Object*/ obj) {\n obj[key] = obj[key] || ++lastId;\n return obj[key];\n };\n}())\n\n/**\n * Remove any leading or trailing whitespace from the given string.\n * If `str` is undefined or does not have a `replace` function, return\n * an empty string.\n */\nexport function trim(str) {\n if (str && typeof(str.replace) == 'function') {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n return \"\";\n}\n\nexport function maxDepth(ary) {\n // given a sorted array of 2-tuples of numbers, count how many \"deep\" the items are.\n // that is, what is the maximum number of tuples that occupy any one moment\n // each tuple should also be sorted\n var stack = [];\n var max_depth = 0;\n for (var i = 0; i < ary.length; i++) {\n\n stack.push(ary[i]);\n if (stack.length > 1) {\n var top = stack[stack.length - 1]\n var bottom_idx = -1;\n for (var j = 0; j < stack.length - 1; j++) {\n if (stack[j][1] < top[0]) {\n bottom_idx = j;\n }\n };\n if (bottom_idx >= 0) {\n stack = stack.slice(bottom_idx + 1);\n }\n\n }\n\n if (stack.length > max_depth) {\n max_depth = stack.length;\n }\n };\n return max_depth;\n}\n\n/**\n * Implement mixin behavior. Based on \n * https://blog.bitsrc.io/understanding-mixins-in-javascript-de5d3e02b466\n * @param {class} cls \n * @param {...class} src \n */\nexport function classMixin(cls, ...src) {\n for (let _cl of src) {\n for (var key of Object.getOwnPropertyNames(_cl.prototype)) {\n cls.prototype[key] = _cl.prototype[key]\n }\n }\n}\n\nexport function ensureUniqueKey(obj, candidate) {\n if (!candidate) { candidate = unique_ID(6); }\n\n if (!(candidate in obj)) { return candidate; }\n\n var root = candidate.match(/^(.+)(-\\d+)?$/)[1];\n var similar_ids = [];\n // get an alternative\n for (let key in obj) {\n if (key.match(/^(.+?)(-\\d+)?$/)[1] == root) {\n similar_ids.push(key);\n }\n }\n candidate = root + \"-\" + (similar_ids.length + 1);\n\n for (var counter = similar_ids.length; similar_ids.indexOf(candidate) != -1; counter++) {\n candidate = root + '-' + counter;\n }\n\n return candidate;\n}\n\nexport function isEmptyObject(o) {\n var properties = []\n if (Object.keys) {\n properties = Object.keys(o);\n } else { // all this to support IE 8\n for (var p in o)\n if (Object.prototype.hasOwnProperty.call(o, p)) properties.push(p);\n }\n for (var i = 0; i < properties.length; i++) {\n var k = properties[i];\n if (o[k] != null && typeof o[k] != \"string\") return false;\n if (trim(o[k]).length != 0) return false;\n }\n return true;\n}\n\nexport function slugify(str) {\n // borrowed from http://stackoverflow.com/a/5782563/102476\n str = trim(str);\n str = str.toLowerCase();\n\n // remove accents, swap ñ for n, etc\n var from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;\";\n var to = \"aaaaaeeeeeiiiiooooouuuunc------\";\n for (var i = 0, l = from.length; i < l; i++) {\n str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));\n }\n\n str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars\n .replace(/\\s+/g, '-') // collapse whitespace and replace by -\n .replace(/-+/g, '-'); // collapse dashes\n\n str = str.replace(/^([0-9])/, '_$1');\n return str;\n}\n\nexport function unique_ID(size, prefix) {\n\n var getRandomNumber = function(range) {\n return Math.floor(Math.random() * range);\n };\n\n var getRandomChar = function() {\n var chars = \"abcdefghijklmnopqurstuvwxyz\";\n return chars.substr(getRandomNumber(32), 1);\n };\n\n var randomID = function(size) {\n var str = \"\";\n for (var i = 0; i < size; i++) {\n str += getRandomChar();\n }\n return str;\n };\n\n if (prefix) {\n return prefix + \"-\" + randomID(size);\n } else {\n return \"tl-\" + randomID(size);\n }\n}\n\nexport function findNextGreater(list, current, default_value) {\n // given a sorted list and a current value which *might* be in the list,\n // return the next greatest value if the current value is >= the last item in the list, return default,\n // or if default is undefined, return input value\n for (var i = 0; i < list.length; i++) {\n if (current < list[i]) {\n return list[i];\n }\n }\n\n return (default_value) ? default_value : current;\n}\n\nexport function findNextLesser(list, current, default_value) {\n // given a sorted list and a current value which *might* be in the list,\n // return the next lesser value if the current value is <= the last item in the list, return default,\n // or if default is undefined, return input value\n for (var i = list.length - 1; i >= 0; i--) {\n if (current > list[i]) {\n return list[i];\n }\n }\n\n return (default_value) ? default_value : current;\n}\n\nexport function isEven(n) {\n return n == parseFloat(n) ? !(n % 2) : void 0;\n}\n\nexport function findArrayNumberByUniqueID(id, array, prop, defaultVal) {\n var _n = defaultVal || 0;\n\n for (var i = 0; i < array.length; i++) {\n if (array[i].data[prop] == id) {\n _n = i;\n }\n };\n\n return _n;\n}\n\nexport function unlinkify(text) {\n if (!text) return text;\n text = text.replace(/<a\\b[^>]*>/i, \"\");\n text = text.replace(/<\\/a>/i, \"\");\n return text;\n}\n\nexport function setData(obj, data) {\n obj.data = extend({}, obj.data, data);\n if (obj.data.unique_id === \"\") {\n obj.data.unique_id = unique_ID(6);\n }\n}\n\nexport function htmlify(str) {\n //if (str.match(/<\\s*p[^>]*>([^<]*)<\\s*\\/\\s*p\\s*>/)) {\n if (str.match(/<p>[\\s\\S]*?<\\/p>/)) {\n\n return str;\n } else {\n return \"<p>\" + str + \"</p>\";\n }\n}\n\nexport function unhtmlify(str) {\n str = str.replace(/(<[^>]*>)+/g, '');\n return str.replace('\"', \"'\");\n}\n\n/*\t* Turns plain text links into real links\n================================================== */\nexport function linkify(text, targets, is_touch) {\n\n var make_link = function(url, link_text, prefix) {\n if (!prefix) {\n prefix = \"\";\n }\n var MAX_LINK_TEXT_LENGTH = 30;\n if (link_text && link_text.length > MAX_LINK_TEXT_LENGTH) {\n link_text = link_text.substring(0, MAX_LINK_TEXT_LENGTH) + \"\\u2026\"; // unicode ellipsis\n }\n return prefix + \"<a class='tl-makelink' href='\" + url + \"' onclick='void(0)'>\" + link_text + \"</a>\";\n }\n // http://, https://, ftp://\n var urlPattern = /\\b(?:https?|ftp):\\/\\/([a-z0-9-+&@#\\/%?=~_|!:,.;]*[a-z0-9-+&@#\\/%=~_|])/gim;\n\n // www. sans http:// or https://\n var pseudoUrlPattern = /(^|[^\\/>])(www\\.[\\S]+(\\b|$))/gim;\n\n // Email addresses\n var emailAddressPattern = /([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+)/gim;\n\n\n return text\n .replace(urlPattern, function(match, url_sans_protocol, offset, string) {\n // Javascript doesn't support negative lookbehind assertions, so\n // we need to handle risk of matching URLs in legit hrefs\n if (offset > 0) {\n var prechar = string[offset - 1];\n if (prechar == '\"' || prechar == \"'\" || prechar == \"=\") {\n return match;\n }\n }\n return make_link(match, url_sans_protocol);\n })\n .replace(pseudoUrlPattern, function(match, beforePseudo, pseudoUrl, offset, string) {\n return make_link('http://' + pseudoUrl, pseudoUrl, beforePseudo);\n })\n .replace(emailAddressPattern, function(match, email, offset, string) {\n return make_link('mailto:' + email, email);\n });\n}\n\n/**\n * Try to make seamless the process of interpreting a URL to a web page which embeds an image for sharing purposes\n * as a direct image link. Some services have predictable transformations we can use rather than explain to people\n * this subtlety.\n */\nexport function transformMediaURL(url) {\n return url.replace(/(.*)www.dropbox.com\\/(.*)/, '$1dl.dropboxusercontent.com/$2')\n}\n\nexport const ratio = {\n square: (size) => {\n var s = {\n w: 0,\n h: 0\n }\n if (size.w > size.h && size.h > 0) {\n s.h = size.h;\n s.w = size.h;\n } else {\n s.w = size.w;\n s.h = size.w;\n }\n return s;\n },\n r16_9: (size) => {\n if (size.w !== null && size.w !== \"\") {\n return Math.round((size.w / 16) * 9);\n } else if (size.h !== null && size.h !== \"\") {\n return Math.round((size.h / 9) * 16);\n } else {\n return 0;\n }\n },\n r4_3: (size) => {\n if (size.w !== null && size.w !== \"\") {\n return Math.round((size.w / 4) * 3);\n } else if (size.h !== null && size.h !== \"\") {\n return Math.round((size.h / 3) * 4);\n }\n }\n}\n\nexport function getUrlVars(string) {\n var str,\n vars = [],\n hash,\n hashes;\n\n str = string.toString();\n\n if (str.match('&')) {\n str = str.replace(\"&\", \"&\");\n } else if (str.match('&')) {\n str = str.replace(\"&\", \"&\");\n } else if (str.match('&')) {\n str = str.replace(\"&\", \"&\");\n }\n\n hashes = str.slice(str.indexOf('?') + 1).split('&');\n\n for (var i = 0; i < hashes.length; i++) {\n hash = hashes[i].split('=');\n vars.push(hash[0]);\n vars[hash[0]] = hash[1];\n }\n\n\n return vars;\n}\n\nexport function getParamString(obj) {\n var params = [];\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n params.push(i + '=' + obj[i]);\n }\n }\n return '?' + params.join('&');\n}\n\nexport function getObjectAttributeByIndex(obj, index) {\n if (typeof obj != 'undefined') {\n var i = 0;\n for (var attr in obj) {\n if (index === i) {\n return obj[attr];\n }\n i++;\n }\n return \"\";\n } else {\n return \"\";\n }\n\n}\n\nlet base58 = (function(alpha) {\n var alphabet = alpha || '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ',\n base = alphabet.length;\n return {\n encode: function(enc) {\n if (typeof enc !== 'number' || enc !== parseInt(enc))\n throw '\"encode\" only accepts integers.';\n var encoded = '';\n while (enc) {\n var remainder = enc % base;\n enc = Math.floor(enc / base);\n encoded = alphabet[remainder].toString() + encoded;\n }\n return encoded;\n },\n decode: function(dec) {\n if (typeof dec !== 'string')\n throw '\"decode\" only accepts strings.';\n var decoded = 0;\n while (dec) {\n var alphabetPosition = alphabet.indexOf(dec[0]);\n if (alphabetPosition < 0)\n throw '\"decode\" can\\'t find \"' + dec[0] + '\" in the alphabet: \"' + alphabet + '\"';\n var powerOf = dec.length - 1;\n decoded += alphabetPosition * (Math.pow(base, powerOf));\n dec = dec.substring(1);\n }\n return decoded;\n }\n };\n})()\n\nexport { base58 }\n\n\nexport function parseYouTubeTime(s) {\n // given a YouTube start time string in a reasonable format, reduce it to a number of seconds as an integer.\n if (typeof(s) == 'string') {\n let parts = s.match(/^\\s*(\\d+h)?(\\d+m)?(\\d+s)?\\s*/i);\n if (parts) {\n var hours = parseInt(parts[1]) || 0;\n var minutes = parseInt(parts[2]) || 0;\n var seconds = parseInt(parts[3]) || 0;\n return seconds + (minutes * 60) + (hours * 60 * 60);\n }\n } else if (typeof(s) == 'number') {\n return s;\n }\n return 0;\n}\n\nexport function stripMarkup(txt) {\n var doc = new DOMParser().parseFromString(txt, 'text/html');\n return doc.body.textContent || \"\";\n}","/* The equations defined here are open source under BSD License.\n * http://www.robertpenner.com/easing_terms_of_use.html (c) 2003 Robert Penner\n * Adapted to single time-based by\n * Brian Crescimanno <[email protected]>\n * Ken Snyder <[email protected]>\n */\n\n/** MIT License\n *\n * KeySpline - use bezier curve for transition easing function\n * Copyright (c) 2012 Gaetan Renaudeau <[email protected]>\n * \n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n/**\n * KeySpline - use bezier curve for transition easing function\n * is inspired from Firefox's nsSMILKeySpline.cpp\n * Usage:\n * var spline = new KeySpline(0.25, 0.1, 0.25, 1.0)\n * spline.get(x) => returns the easing value | x must be in [0, 1] range\n */\n\nconst Easings = {\n ease: [0.25, 0.1, 0.25, 1.0], \n linear: [0.00, 0.0, 1.00, 1.0],\n easein: [0.42, 0.0, 1.00, 1.0],\n easeout: [0.00, 0.0, 0.58, 1.0],\n easeinout: [0.42, 0.0, 0.58, 1.0]\n};\n\nfunction sinusoidal(pos){\n\treturn (-Math.cos(pos * Math.PI) / 2) + 0.5;\n}\n\nfunction KeySpline(a) {\n//KeySpline(mX1, mY1, mX2, mY2){\n function get(aX) {\n if (a[0] == a[1] && a[2] == a[3]) return aX; // linear\n return CalcBezier(GetTForX(aX), a[1], a[3]);\n }\n\n\tfunction A(aA1, aA2) {\n\t\treturn 1.0 - 3.0 * aA2 + 3.0 * aA1;\n\t}\n\n\tfunction B(aA1, aA2) {\n\t\treturn 3.0 * aA2 - 6.0 * aA1;\n\t}\n\n\tfunction C(aA1) {\n\t\treturn 3.0 * aA1;\n\t}\n\n\t// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\n\n\tfunction CalcBezier(aT, aA1, aA2) {\n\t\treturn ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n\t}\n\n\t// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\n\n\tfunction GetSlope(aT, aA1, aA2) {\n\t\treturn 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n\t}\n\n\tfunction GetTForX(aX) {\n\t\t// Newton raphson iteration\n\t\tvar aGuessT = aX;\n\t\tfor (var i = 0; i < 4; ++i) {\n\t\t\tvar currentSlope = GetSlope(aGuessT, a[0], a[2]);\n\t\t\tif (currentSlope == 0.0) return aGuessT;\n\t\t\tvar currentX = CalcBezier(aGuessT, a[0], a[2]) - aX;\n\t\t\taGuessT -= currentX / currentSlope;\n\t\t}\n\t\treturn aGuessT;\n\t}\n}\n\t\n\n\nexport function easeInSpline(t){\n\tvar spline = new KeySpline(Easings.easein);\n\treturn spline.get(t);\n}\n\nexport function easeInOutExpo(t){\n\tvar spline = new KeySpline(Easings.easein);\n\treturn spline.get(t);\n}\n\nexport function easeOut(t){\n\treturn Math.sin(t * Math.PI / 2);\n}\nexport function easeOutStrong(t){\n\treturn (t == 1) ? 1 : 1 - Math.pow(2, - 10 * t);\n}\nexport function easeIn(t){\n\treturn t * t;\n}\nexport function easeInStrong(t){\n\treturn (t == 0) ? 0 : Math.pow(2, 10 * (t - 1));\n}\nexport function easeOutBounce(pos){\n\tif ((pos) < (1 / 2.75)) {\n\t\treturn (7.5625 * pos * pos);\n\t} else if (pos < (2 / 2.75)) {\n\t\treturn (7.5625 * (pos -= (1.5 / 2.75)) * pos + .75);\n\t} else if (pos < (2.5 / 2.75)) {\n\t\treturn (7.5625 * (pos -= (2.25 / 2.75)) * pos + .9375);\n\t} else {\n\t\treturn (7.5625 * (pos -= (2.625 / 2.75)) * pos + .984375);\n\t}\n}\nexport function easeInBack(pos){\n\tvar s = 1.70158;\n\treturn (pos) * pos * ((s + 1) * pos - s);\n}\nexport function easeOutBack(pos){\n\tvar s = 1.70158;\n\treturn (pos = pos - 1) * pos * ((s + 1) * pos + s) + 1;\n}\nexport function bounce(t){\n\tif (t < (1 / 2.75)) {\n\t\treturn 7.5625 * t * t;\n\t}\n\tif (t < (2 / 2.75)) {\n\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n\t}\n\tif (t < (2.5 / 2.75)) {\n\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n\t}\n\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n}\nexport function bouncePast(pos){\n\tif (pos < (1 / 2.75)) {\n\t\treturn (7.5625 * pos * pos);\n\t} else if (pos < (2 / 2.75)) {\n\t\treturn 2 - (7.5625 * (pos -= (1.5 / 2.75)) * pos + .75);\n\t} else if (pos < (2.5 / 2.75)) {\n\t\treturn 2 - (7.5625 * (pos -= (2.25 / 2.75)) * pos + .9375);\n\t} else {\n\t\treturn 2 - (7.5625 * (pos -= (2.625 / 2.75)) * pos + .984375);\n\t}\n}\nexport function swingTo(pos){\n\tvar s = 1.70158;\n\treturn (pos -= 1) * pos * ((s + 1) * pos + s) + 1;\n}\nexport function swingFrom(pos){\n\tvar s = 1.70158;\n\treturn pos * pos * ((s + 1) * pos - s);\n}\nexport function elastic(pos){\n\treturn -1 * Math.pow(4, - 8 * pos) * Math.sin((pos * 6 - 1) * (2 * Math.PI) / 2) + 1;\n}\nexport function spring(pos){\n\treturn 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));\n}\nexport function blink(pos, blinks){\n\treturn Math.round(pos * (blinks || 5)) % 2;\n}\nexport function pulse(pos, pulses){\n\treturn (-Math.cos((pos * ((pulses || 5) - .5) * 2) * Math.PI) / 2) + .5;\n}\nexport function wobble(pos){\n\treturn (-Math.cos(pos * Math.PI * (9 * pos)) / 2) + 0.5;\n}\n\nexport function flicker(pos){\n\tvar pos = pos + (Math.random() - 0.5) / 5;\n\treturn sinusoidal(pos < 0 ? 0 : pos > 1 ? 1 : pos);\n}\nexport function mirror(pos){\n\tif (pos < 0.5) return sinusoidal(pos * 2);\n\telse return sinusoidal(1 - (pos - 0.5) * 2);\n}\n// accelerating from zero velocity\nexport function easeInQuad(t){ return t*t }\n// decelerating to zero velocity\nexport function easeOutQuad(t){ return t*(2-t) }\n// acceleration until halfway, then deceleration\nexport function easeInOutQuad(t){ return t<.5 ? 2*t*t : -1+(4-2*t)*t }\n// accelerating from zero velocity \nexport function easeInCubic(t){ return t*t*t }\n// decelerating to zero velocity \nexport function easeOutCubic(t){ return (--t)*t*t+1 }\n// acceleration until halfway, then deceleration \nexport function easeInOutCubic(t){ return t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1 }\n// accelerating from zero velocity \nexport function easeInQuart(t){ return t*t*t*t }\n// decelerating to zero velocity \nexport function easeOutQuart(t){ return 1-(--t)*t*t*t }\n// acceleration until halfway, then deceleration\nexport function easeInOutQuart(t){ return t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t }\n// accelerating from zero velocity\nexport function easeInQuint(t){ return t*t*t*t*t }\n// decelerating to zero velocity\nexport function easeOutQuint(t){ return 1+(--t)*t*t*t*t }\n// acceleration until halfway, then deceleration \nexport function easeInOutQuint(t){ return t<.5 ? 16*t*t*t*t*t : 1+16*(--t)*t*t*t*t }\n\n","/*\tTLClass\n\tClass powers the OOP facilities of the library.\n================================================== */\n\nimport { extend as util_extend } from \"./Util\"\n\nlet TLClass = function () {};\n\nTLClass.extend = function (/*Object*/ props) /*-> Class*/ {\n \n\t// extended class with the new prototype\n\tvar NewClass = function () {\n\t\tif (this.initialize) {\n\t\t\tthis.initialize.apply(this, arguments);\n\t\t}\n\t};\n\n\t// instantiate class without calling constructor\n\tvar F = function () {};\n\tF.prototype = this.prototype;\n\tvar proto = new F();\n\n\tproto.constructor = NewClass;\n\tNewClass.prototype = proto;\n\n\t// add superclass access\n\tNewClass.superclass = this.prototype;\n\n\t// add class name\n\t//proto.className = props;\n\n\t//inherit parent's statics\n\tfor (var i in this) {\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype' && i !== 'superclass') {\n\t\t\tNewClass[i] = this[i];\n\t\t}\n\t}\n\n\t// mix static properties into the class\n\tif (props.statics) {\n\t\tutil_extend(NewClass, props.statics);\n\t\tdelete props.statics;\n\t}\n\n\t// mix includes into the prototype\n\tif (props.includes) {\n\t\tutil_extend.apply(null, [proto].concat(props.includes));\n\t\tdelete props.includes;\n\t}\n\n\t// merge options\n\tif (props.options && proto.options) {\n\t\tprops.options = util_extend({}, proto.options, props.options);\n\t}\n\n\t// mix given properties into the prototype\n\tutil_extend(proto, props);\n\n\t// allow inheriting further\n\tNewClass.extend = TLClass.extend;\n\n\t// method for adding properties to prototype\n\tNewClass.include = function (props) {\n\t\tutil_extend(this.prototype, props);\n\t};\n\n\treturn NewClass;\n};\n\nexport { TLClass }\n","/*\tEvents\n\tadds custom events functionality to TL classes\n================================================== */\n\nimport { mergeData, trace } from \"../core/Util\"\nimport TLError from \"../core/TLError\"\n\nexport default class Events {\n\n /**\n * Add an event listener callback for the given type.\n * @param {string} type \n * @param {function} fn \n * @param {object} [context] \n * @returns { Events } this (the instance upon which the method was called)\n */\n on(type, fn, context) {\n if (!fn) {\n throw new TLError(\"No callback function provided\")\n }\n var events = this._tl_events = this._tl_events || {};\n events[type] = events[type] || [];\n events[type].push({\n action: fn,\n context: context || this\n });\n return this;\n }\n\n /**\n * Synonym for on(type, fn, context). It would be great to determine \n * that this is obsolete, but that wasn't clear.\n * @param {string} type\n * @param {function} fn\n * @param {object} [context]\n * @returns { Events } this (the instance upon which the method was called)\n */\n addEventListener( /*String*/ type, /*Function*/ fn, /*(optional) Object*/ context) {\n return this.on(type, fn, context)\n }\n\n /**\n * Return true if this object has any listeners of the given type.\n * @param {string} type \n * @returns {boolean}\n */\n hasEventListeners(type) {\n var k = '_tl_events';\n return (k in this) && (type in this[k]) && (this[k][type].length > 0);\n }\n\n /**\n * Remove any event listeners for the given type that use the given \n * callback and have the given context.\n * @param {string} type \n * @param {function} fn \n * @param {object} context \n * @returns { Events } this (the instance upon which the method was called)\n */\n removeEventListener( /*String*/ type, /*Function*/ fn, /*(optional) Object*/ context) {\n if (!this.hasEventListeners(type)) {\n return this;\n }\n\n for (var i = 0, events = this._tl_events, len = events[type].length; i < len; i++) {\n if (\n (events[type][i].action === fn) &&\n (!context || (events[type][i].context === context))\n ) {\n events[type].splice(i, 1);\n return this;\n }\n }\n return this;\n }\n\n /**\n * Synonym for removeEventListener. Is this really needed? While 'off' is opposite of 'on',\n * it doesn't actually read as 'remove' unless you know that.\n * @param {string} type\n * @param {function} fn\n * @param {object} context\n * @returns { Events } this (the instance upon which the method was called)\n */\n off(type, fn, context) {\n return this.removeEventListener(type, fn, context)\n }\n\n /**\n * Activate (execute) all registered callback functions for the given\n * type, passing the given data, if any.\n * @param {string} type \n * @param {object} [data] \n * @returns { Events } this (the instance upon which the method was called)\n */\n fire(type, data) {\n if (!this.hasEventListeners(type)) {\n return this;\n }\n\n var event = mergeData({\n type: type,\n target: this\n }, data);\n\n var listeners = this._tl_events[type].slice();\n\n for (var i = 0, len = listeners.length; i < len; i++) {\n if (listeners[i].action) {\n listeners[i].action.call(listeners[i].context || this, event);\n } else {\n trace(`no action defined for ${type} listener`)\n }\n }\n\n return this;\n }\n\n};","/*\tAnimate\n Basic animation\n once we've switched to an npm buildable model\n we could probably replace this with a true dependency upon\n https://www.npmjs.com/package/morpheus\n================================================== */\n\nexport function Animate(el, options) {\n\treturn tlanimate(el, options)\n};\n\n\n/*\tBased on: Morpheus\n\thttps://github.com/ded/morpheus - (c) Dustin Diaz 2011\n\tLicense MIT\n================================================== */\nconst tlanimate = function () {\n\n\tvar doc = document,\n\t\twin = window,\n\t\tperf = win.performance,\n\t\tperfNow = perf && (perf.now || perf.webkitNow || perf.msNow || perf.mozNow),\n\t\tnow = perfNow ? function () { return perfNow.call(perf) } : function () { return +new Date() },\n\t\thtml = doc.documentElement,\n\t\tfixTs = false, // feature detected below\n\t\tthousand = 1000,\n\t\trgbOhex = /^rgb\\(|#/,\n\t\trelVal = /^([+\\-])=([\\d\\.]+)/,\n\t\tnumUnit = /^(?:[\\+\\-]=?)?\\d+(?:\\.\\d+)?(%|in|cm|mm|em|ex|pt|pc|px)$/,\n\t\trotate = /rotate\\(((?:[+\\-]=)?([\\-\\d\\.]+))deg\\)/,\n\t\tscale = /scale\\(((?:[+\\-]=)?([\\d\\.]+))\\)/,\n\t\tskew = /skew\\(((?:[+\\-]=)?([\\-\\d\\.]+))deg, ?((?:[+\\-]=)?([\\-\\d\\.]+))deg\\)/,\n\t\ttranslate = /translate\\(((?:[+\\-]=)?([\\-\\d\\.]+))px, ?((?:[+\\-]=)?([\\-\\d\\.]+))px\\)/,\n\t\t// these elements do not require 'px'\n\t\tunitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1, transform: 1};\n\n // which property name does this browser use for transform\n\tvar transform = function () {\n\t\tvar styles = doc.createElement('a').style,\n\t\t\tprops = ['webkitTransform', 'MozTransform', 'OTransform', 'msTransform', 'Transform'],\n\t\t\ti;\n\n\t\tfor (i = 0; i < props.length; i++) {\n\t\t\tif (props[i] in styles) return props[i]\n\t\t};\n\t}();\n\n\t// does this browser support the opacity property?\n\tvar opacity = function () {\n\t\treturn typeof doc.createElement('a').style.opacity !== 'undefined'\n\t}();\n\n\t// initial style is determined by the elements themselves\n\tvar getStyle = doc.defaultView && doc.defaultView.getComputedStyle ?\n\tfunction (el, property) {\n\t\tproperty = property == 'transform' ? transform : property\n\t\tproperty = camelize(property)\n\t\tvar value = null,\n\t\t\tcomputed = doc.defaultView.getComputedStyle(el, '');\n\n\t\tcomputed && (value = computed[property]);\n\t\treturn el.style[property] || value;\n\t} : html.currentStyle ?\n\n function (el, property) {\n\t\tproperty = camelize(property)\n\n\t\tif (property == 'opacity') {\n\t\t\tvar val = 100\n\t\t\ttry {\n\t\t\t\tval = el.filters['DXImageTransform.Microsoft.Alpha'].opacity\n\t\t\t} catch (e1) {\n\t\t\t\ttry {\n\t\t\t\t\tval = el.filters('alpha').opacity\n\t\t\t\t} catch (e2) {\n\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn val / 100\n\t\t}\n\t\tvar value = el.currentStyle ? el.currentStyle[property] : null\n\t\treturn el.style[property] || value\n\t} :\n\n function (el, property) {\n\t\treturn el.style[camelize(property)]\n }\n\n var frame = function () {\n // native animation frames\n // http://webstuff.nfshost.com/anim-timing/Overview.html\n // http://dev.chromium.org/developers/design-documents/requestanimationframe-implementation\n return win.requestAnimationFrame ||\n win.webkitRequestAnimationFrame ||\n win.mozRequestAnimationFrame ||\n win.msRequestAnimationFrame ||\n win.oRequestAnimationFrame ||\n function (callback) {\n win.setTimeout(function () {\n callback(+new Date())\n }, 17) // when I was 17..\n }\n }()\n\n var children = []\n\n\tframe(function(timestamp) {\n\t \t// feature-detect if rAF and now() are of the same scale (epoch or high-res),\n\t\t// if not, we have to do a timestamp fix on each frame\n\t\tfixTs = timestamp > 1e12 != now() > 1e12\n\t})\n\n function has(array, elem, i) {\n if (Array.prototype.indexOf) return array.indexOf(elem)\n for (i = 0; i < array.length; ++i) {\n if (array[i] === elem) return i\n }\n }\n\n function render(timestamp) {\n var i, count = children.length\n // if we're using a high res timer, make sure timestamp is not the old epoch-based value.\n // http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision\n if (perfNow && timestamp > 1e12) timestamp = now()\n\tif (fixTs) timestamp = now()\n for (i = count; i--;) {\n children[i](timestamp)\n }\n children.length && frame(render)\n }\n\n function live(f) {\n if (children.push(f) === 1) frame(render)\n }\n\n function die(f) {\n var rest, index = has(children, f)\n if (index >= 0) {\n rest = children.slice(index + 1)\n children.length = index\n children = children.concat(rest)\n }\n }\n\n function parseTransform(style, base) {\n var values = {}, m\n if (m = style.match(rotate)) values.rotate = by(m[1], base ? base.rotate : null)\n if (m = style.match(scale)) values.scale = by(m[1], base ? base.scale : null)\n if (m = style.match(skew)) {values.skewx = by(m[1], base ? base.skewx : null); values.skewy = by(m[3], base ? base.skewy : null)}\n if (m = style.match(translate)) {values.translatex = by(m[1], base ? base.translatex : null); values.translatey = by(m[3], base ? base.translatey : null)}\n return values\n }\n\n function formatTransform(v) {\n var s = ''\n if ('rotate' in v) s += 'rotate(' + v.rotate + 'deg) '\n if ('scale' in v) s += 'scale(' + v.scale + ') '\n if ('translatex' in v) s += 'translate(' + v.translatex + 'px,' + v.translatey + 'px) '\n if ('skewx' in v) s += 'skew(' + v.skewx + 'deg,' + v.skewy + 'deg)'\n return s\n }\n\n function rgb(r, g, b) {\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1)\n }\n\n // convert rgb and short hex to long hex\n function toHex(c) {\n var m = c.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n return (m ? rgb(m[1], m[2], m[3]) : c)\n .replace(/#(\\w)(\\w)(\\w)$/, '#$1$1$2$2$3$3') // short skirt to long jacket\n }\n\n // change font-size => fontSize etc.\n function camelize(s) {\n return s.replace(/-(.)/g, function (m, m1) {\n return m1.toUpperCase()\n })\n }\n\n // aren't we having it?\n function fun(f) {\n return typeof f == 'function'\n }\n\n function nativeTween(t) {\n // default to a pleasant-to-the-eye easeOut (like native animations)\n return Math.sin(t * Math.PI / 2)\n }\n\n /**\n * Core tween method that requests each frame\n * @param duration: time in milliseconds. defaults to 1000\n * @param fn: tween frame callback function receiving 'position'\n * @param done {optional}: complete callback function\n * @param ease {optional}: easing method. defaults to easeOut\n * @param from {optional}: integer to start from\n * @param to {optional}: integer to end at\n * @returns method to stop the animation\n */\n function tween(duration, fn, done, ease, from, to) {\n ease = fun(ease) ? ease : morpheus.easings[ease] || nativeTween\n var time = duration || thousand\n , self = this\n , diff = to - from\n , start = now()\n , stop = 0\n , end = 0\n\n function run(t) {\n var delta = t - start\n if (delta > time || stop) {\n to = isFinite(to) ? to : 1\n stop ? end && fn(to) : fn(to)\n die(run)\n return done && done.apply(self)\n }\n // if you don't specify a 'to' you can use tween as a generic delta tweener\n // cool, eh?\n isFinite(to) ?\n fn((diff * ease(delta / time)) + from) :\n fn(ease(delta / time))\n }\n\n live(run)\n\n return {\n stop: function (jump) {\n stop = 1\n end = jump // jump to end of animation?\n if (!jump) done = null // remove callback if not jumping to end\n }\n }\n }\n\n /**\n * generic bezier method for animating x|y coordinates\n * minimum of 2 points required (start and end).\n * first point start, last point end\n * additional control points are optional (but why else would you use this anyway ;)\n * @param points: array containing control points\n [[0, 0], [100, 200], [200, 100]]\n * @param pos: current be(tween) position represented as float 0 - 1\n * @return [x, y]\n */\n function bezier(points, pos) {\n var n = points.length, r = [], i, j\n for (i = 0; i < n; ++i) {\n r[i] = [points[i][0], points[i][1]]\n }\n for (j = 1; j < n; ++j) {\n for (i = 0; i < n - j; ++i) {\n r[i][0] = (1 - pos) * r[i][0] + pos * r[parseInt(i + 1, 10)][0]\n r[i][1] = (1 - pos) * r[i][1] + pos * r[parseInt(i + 1, 10)][1]\n }\n }\n return [r[0][0], r[0][1]]\n }\n\n // this gets you the next hex in line according to a 'position'\n function nextColor(pos, start, finish) {\n var r = [], i, e, from, to\n for (i = 0; i < 6; i++) {\n from = Math.min(15, parseInt(start.charAt(i), 16))\n to = Math.min(15, parseInt(finish.charAt(i), 16))\n e = Math.floor((to - from) * pos + from)\n e = e > 15 ? 15 : e < 0 ? 0 : e\n r[i] = e.toString(16)\n }\n return '#' + r.join('')\n }\n\n // this retreives the frame value within a sequence\n function getTweenVal(pos, units, begin, end, k, i, v) {\n if (k == 'transform') {\n v = {}\n for (var t in begin[i][k]) {\n v[t] = (t in end[i][k]) ? Math.round(((end[i][k][t] - begin[i][k][t]) * pos + begin[i][k][t]) * thousand) / thousand : begin[i][k][t]\n }\n return v\n } else if (typeof begin[i][k] == 'string') {\n return nextColor(pos, begin[i][k], end[i][k])\n } else {\n // round so we don't get crazy long floats\n v = Math.round(((end[i][k] - begin[i][k]) * pos + begin[i][k]) * thousand) / thousand\n // some css properties don't require a unit (like zIndex, lineHeight, opacity)\n if (!(k in unitless)) v += units[i][k] || 'px'\n return v\n }\n }\n\n // support for relative movement via '+=n' or '-=n'\n function by(val, start, m, r, i) {\n return (m = relVal.exec(val)) ?\n (i = parseFloat(m[2])) && (start + (m[1] == '+' ? 1 : -1) * i) :\n parseFloat(val)\n }\n\n /**\n * morpheus:\n * @param element(s): HTMLElement(s)\n * @param options: mixed bag between CSS Style properties & animation options\n * - {n} CSS properties|values\n * - value can be strings, integers,\n * - or callback function that receives element to be animated. method must return value to be tweened\n * - relative animations start with += or -= followed by integer\n * - duration: time in ms - defaults to 1000(ms)\n * - easing: a transition method - defaults to an 'easeOut' algorithm\n * - complete: a callback method for when all elements have finished\n * - bezier: array of arrays containing x|y coordinates that define the bezier points. defaults to none\n * - this may also be a function that receives element to be animated. it must return a value\n */\n function morpheus(elements, options) {\n var els = elements ? (els = isFinite(elements.length) ? elements : [elements]) : [], i\n , complete = options.complete\n , duration = options.duration\n , ease = options.easing\n , points = options.bezier\n , begin = []\n , end = []\n , units = []\n , bez = []\n , originalLeft\n , originalTop\n\n if (points) {\n // remember the original values for top|left\n originalLeft = options.left;\n originalTop = options.top;\n delete options.right;\n delete options.bottom;\n delete options.left;\n delete options.top;\n }\n\n for (i = els.length; i--;) {\n\n // record beginning and end states to calculate positions\n begin[i] = {}\n end[i] = {}\n units[i] = {}\n\n // are we 'moving'?\n if (points) {\n\n var left = getStyle(els[i], 'left')\n , top = getStyle(els[i], 'top')\n , xy = [by(fun(originalLeft) ? originalLeft(els[i]) : originalLeft || 0, parseFloat(left)),\n by(fun(originalTop) ? originalTop(els[i]) : originalTop || 0, parseFloat(top))]\n\n bez[i] = fun(points) ? points(els[i], xy) : points\n bez[i].push(xy)\n bez[i].unshift([\n parseInt(left, 10),\n parseInt(top, 10)\n ])\n }\n\n for (var k in options) {\n switch (k) {\n case 'complete':\n case 'duration':\n case 'easing':\n case 'bezier':\n continue\n }\n var v = getStyle(els[i], k), unit\n , tmp = fun(options[k]) ? options[k](els[i]) : options[k]\n if (typeof tmp == 'string' &&\n rgbOhex.test(tmp) &&\n !rgbOhex.test(v)) {\n delete options[k]; // remove key :(\n continue; // cannot animate colors like 'orange' or 'transparent'\n // only #xxx, #xxxxxx, rgb(n,n,n)\n }\n\n begin[i][k] = k == 'transform' ? parseTransform(v) :\n typeof tmp == 'string' && rgbOhex.test(tmp) ?\n toHex(v).slice(1) :\n parseFloat(v)\n end[i][k] = k == 'transform' ? parseTransform(tmp, begin[i][k]) :\n typeof tmp == 'string' && tmp.charAt(0) == '#' ?\n toHex(tmp).slice(1) :\n by(tmp, parseFloat(v));\n // record original unit\n (typeof tmp == 'string') && (unit = tmp.match(numUnit)) && (units[i][k] = unit[1])\n }\n }\n // ONE TWEEN TO RULE THEM ALL\n return tween.apply(els, [duration, function (pos, v, xy) {\n // normally not a fan of optimizing for() loops, but we want something\n // fast for animating\n for (i = els.length; i--;) {\n if (points) {\n xy = bezier(bez[i], pos)\n els[i].style.left = xy[0] + 'px'\n els[i].style.top = xy[1] + 'px'\n }\n for (var k in options) {\n v = getTweenVal(pos, units, begin, end, k, i)\n k == 'transform' ?\n els[i].style[transform] = formatTransform(v) :\n k == 'opacity' && !opacity ?\n (els[i].style.filter = 'alpha(opacity=' + (v * 100) + ')') :\n (els[i].style[camelize(k)] = v)\n }\n }\n }, complete, ease])\n }\n\n // expose useful methods\n morpheus.tween = tween\n morpheus.getStyle = getStyle\n morpheus.bezier = bezier\n morpheus.transform = transform\n morpheus.parseTransform = parseTransform\n morpheus.formatTransform = formatTransform\n morpheus.easings = {}\n\n return morpheus\n}() // must be executed at initialization","/*\t\n\tDOM methods used regularly\n\tAssumes there is a _el.container and animator\n================================================== */\nimport { getPosition } from \"../dom/DOM\"\nimport { Animate } from \"../animation/Animate\"\n\nexport class DOMMixins {\n /*\tAdding, Hiding, Showing etc\n\t================================================== */\n show(animate) {\n if (animate) {\n /*\n\t\t\tthis.animator = Animate(this._el.container, {\n\t\t\t\tleft: \t\t-(this._el.container.offsetWidth * n) + \"px\",\n\t\t\t\tduration: \tthis.options.duration,\n\t\t\t\teasing: \tthis.options.ease\n\t\t\t});\n\t\t\t*/\n } else {\n this._el.container.style.display = \"block\";\n }\n }\n\n hide(animate) {\n this._el.container.style.display = \"none\";\n }\n\n addTo(container) {\n container.appendChild(this._el.container);\n this.onAdd();\n }\n\n removeFrom(container) {\n container.removeChild(this._el.container);\n this.onRemove();\n }\n\n /*\tAnimate to Position\n\t================================================== */\n animatePosition(pos, el) {\n var ani = {\n duration: this.options.duration,\n easing: this.options.ease\n };\n for (var name in pos) {\n if (pos.hasOwnProperty(name)) {\n ani[name] = pos[name] + \"px\";\n }\n }\n\n if (this.animator) {\n this.animator.stop();\n }\n this.animator = Animate(el, ani);\n }\n\n /*\tEvents\n\t================================================== */\n\n onLoaded() {\n this.fire(\"loaded\", this.data);\n }\n\n onAdd() {\n this.fire(\"added\", this.data);\n }\n\n onRemove() {\n this.fire(\"removed\", this.data);\n }\n\n /*\tSet the Position\n\t================================================== */\n setPosition(pos, el) {\n for (var name in pos) {\n if (pos.hasOwnProperty(name)) {\n if (el) {\n el.style[name] = pos[name] + \"px\";\n } else {\n this._el.container.style[name] = pos[name] + \"px\";\n }\n }\n }\n }\n\n getPosition() {\n return getPosition(this._el.container);\n }\n}\n","/*\tDraggable\n\tDraggable allows you to add dragging capabilities to any element. Supports mobile devices too.\n================================================== */\nimport { TLClass } from \"../core/TLClass\"\nimport Events from \"../core/Events\"\nimport { touch as BROWSER_TOUCH } from \"../core/Browser\"\nimport { mergeData, classMixin } from \"../core/Util\"\nimport { getPosition } from \"../dom/DOM\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport { Animate } from \"../animation/Animate\"\nimport { easeInOutQuint, easeOutStrong } from \"../animation/Ease\"\n\nexport class Draggable{\n\n constructor(drag_elem, options, move_elem) {\n // DOM ELements\n this._el = {\n drag: drag_elem,\n move: drag_elem\n }\n\n this.mousedrag = {\n down: \"mousedown\",\n up: \"mouseup\",\n leave: \"mouseleave\",\n move: \"mousemove\"\n }\n\n this.touchdrag = {\n down: \"touchstart\",\n up: \"touchend\",\n leave: \"mouseleave\",\n move: \"touchmove\"\n }\n\n if (move_elem) {\n this._el.move = move_elem;\n }\n\n //Options\n this.options = {\n enable: {\n x: true,\n y: true\n },\n constraint: {\n top: false,\n bottom: false,\n left: false,\n right: false\n },\n momentum_multiplier: 2000,\n duration: 1000,\n ease: easeInOutQuint\n };\n\n // Animation Object\n this.animator = null;\n\n // Drag Event Type\n this.dragevent = this.mousedrag;\n\n if (BROWSER_TOUCH) {\n this.dragevent = this.touchdrag;\n }\n\n // Draggable Data\n this.data = {\n sliding: false,\n direction: \"none\",\n pagex: {\n start: 0,\n end: 0\n },\n pagey: {\n start: 0,\n end: 0\n },\n pos: {\n start: {\n x: 0,\n y: 0\n },\n end: {\n x: 0,\n y: 0\n }\n },\n new_pos: {\n x: 0,\n y: 0\n },\n new_pos_parent: {\n x: 0,\n y: 0\n },\n time: {\n start: 0,\n end: 0\n },\n touch: false\n };\n\n // Merge Data and Options\n mergeData(this.options, options);\n }\n\n enable(e) {\n this.data.pos.start = 0;\n this._el.move.style.left = this.data.pos.start.x + \"px\";\n this._el.move.style.top = this.data.pos.start.y + \"px\";\n this._el.move.style.position = \"absolute\";\n }\n\n disable() {\n DOMEvent.removeListener(\n this._el.drag,\n this.dragevent.down,\n this._onDragStart,\n this\n );\n DOMEvent.removeListener(\n this._el.drag,\n this.dragevent.up,\n this._onDragEnd,\n this\n );\n }\n\n stopMomentum() {\n if (this.animator) {\n this.animator.stop();\n }\n }\n\n updateConstraint(c) {\n this.options.constraint = c;\n }\n\n /*\tPrivate Methods\n\t================================================== */\n _onDragStart(e) {\n if (BROWSER_TOUCH) {\n if (e.originalEvent) {\n this.data.pagex.start = e.originalEvent.touches[0].screenX;\n this.data.pagey.start = e.originalEvent.touches[0].screenY;\n } else {\n this.data.pagex.start = e.targetTouches[0].screenX;\n this.data.pagey.start = e.targetTouches[0].screenY;\n }\n } else {\n this.data.pagex.start = e.pageX;\n this.data.pagey.start = e.pageY;\n }\n\n // Center element to finger or mouse\n if (this.options.enable.x) {\n this._el.move.style.left =\n this.data.pagex.start - this._el.move.offsetWidth / 2 + \"px\";\n }\n\n if (this.options.enable.y) {\n this._el.move.style.top =\n this.data.pagey.start - this._el.move.offsetHeight / 2 + \"px\";\n }\n\n this.data.pos.start = getPosition(this._el.drag);\n this.data.time.start = new Date().getTime();\n\n this.fire(\"dragstart\", this.data);\n DOMEvent.addListener(\n this._el.drag,\n this.dragevent.move,\n this._onDragMove,\n this\n );\n DOMEvent.addListener(\n this._el.drag,\n this.dragevent.leave,\n this._onDragEnd,\n this\n );\n }\n\n _onDragEnd(e) {\n this.data.sliding = false;\n DOMEvent.removeListener(\n this._el.drag,\n this.dragevent.move,\n this._onDragMove,\n this\n );\n DOMEvent.removeListener(\n this._el.drag,\n this.dragevent.leave,\n this._onDragEnd,\n this\n );\n this.fire(\"dragend\", this.data);\n\n // momentum\n this._momentum();\n }\n\n _onDragMove(e) {\n e.preventDefault();\n this.data.sliding = true;\n\n if (BROWSER_TOUCH) {\n if (e.originalEvent) {\n this.data.pagex.end = e.originalEvent.touches[0].screenX;\n this.data.pagey.end = e.originalEvent.touches[0].screenY;\n } else {\n this.data.pagex.end = e.targetTouches[0].screenX;\n this.data.pagey.end = e.targetTouches[0].screenY;\n }\n } else {\n this.data.pagex.end = e.pageX;\n this.data.pagey.end = e.pageY;\n }\n\n this.data.pos.end = getPosition(this._el.drag);\n this.data.new_pos.x = -(\n this.data.pagex.start -\n this.data.pagex.end -\n this.data.pos.start.x\n );\n this.data.new_pos.y = -(\n this.data.pagey.start -\n this.data.pagey.end -\n this.data.pos.start.y\n );\n\n if (this.options.enable.x) {\n this._el.move.style.left = this.data.new_pos.x + \"px\";\n }\n\n if (this.options.enable.y) {\n this._el.move.style.top = this.data.new_pos.y + \"px\";\n }\n\n this.fire(\"dragmove\", this.data);\n }\n\n _momentum() {\n var pos_adjust = {\n x: 0,\n y: 0,\n time: 0\n },\n pos_change = {\n x: 0,\n y: 0,\n time: 0\n },\n swipe = false,\n swipe_direction = \"\";\n\n if (BROWSER_TOUCH) {\n // Treat mobile multiplier differently\n //this.options.momentum_multiplier = this.options.momentum_multiplier * 2;\n }\n\n pos_adjust.time = (new Date().getTime() - this.data.time.start) * 10;\n pos_change.time = (new Date().getTime() - this.data.time.start) * 10;\n\n pos_change.x =\n this.options.momentum_multiplier *\n (Math.abs(this.data.pagex.end) - Math.abs(this.data.pagex.start));\n pos_change.y =\n this.options.momentum_multiplier *\n (Math.abs(this.data.pagey.end) - Math.abs(this.data.pagey.start));\n\n pos_adjust.x = Math.round(pos_change.x / pos_change.time);\n pos_adjust.y = Math.round(pos_change.y / pos_change.time);\n\n this.data.new_pos.x = Math.min(this.data.pos.end.x + pos_adjust.x);\n this.data.new_pos.y = Math.min(this.data.pos.end.y + pos_adjust.y);\n\n if (!this.options.enable.x) {\n this.data.new_pos.x = this.data.pos.start.x;\n } else if (this.data.new_pos.x < 0) {\n this.data.new_pos.x = 0;\n }\n\n if (!this.options.enable.y) {\n this.data.new_pos.y = this.data.pos.start.y;\n } else if (this.data.new_pos.y < 0) {\n this.data.new_pos.y = 0;\n }\n\n // Detect Swipe\n if (pos_change.time < 3000) {\n swipe = true;\n }\n\n // Detect Direction\n if (Math.abs(pos_change.x) > 10000) {\n this.data.direction = \"left\";\n if (pos_change.x > 0) {\n this.data.direction = \"right\";\n }\n }\n // Detect Swipe\n if (Math.abs(pos_change.y) > 10000) {\n this.data.direction = \"up\";\n if (pos_change.y > 0) {\n this.data.direction = \"down\";\n }\n }\n this._animateMomentum();\n if (swipe) {\n this.fire(\"swipe_\" + this.data.direction, this.data);\n }\n }\n\n _animateMomentum() {\n var pos = {\n x: this.data.new_pos.x,\n y: this.data.new_pos.y\n },\n animate = {\n duration: this.options.duration,\n easing: easeOutStrong\n };\n\n if (this.options.enable.y) {\n if (this.options.constraint.top || this.options.constraint.bottom) {\n if (pos.y > this.options.constraint.bottom) {\n pos.y = this.options.constraint.bottom;\n } else if (pos.y < this.options.constraint.top) {\n pos.y = this.options.constraint.top;\n }\n }\n animate.top = Math.floor(pos.y) + \"px\";\n }\n\n if (this.options.enable.x) {\n if (this.options.constraint.left || this.options.constraint.right) {\n if (pos.x > this.options.constraint.left) {\n pos.x = this.options.constraint.left;\n } else if (pos.x < this.options.constraint.right) {\n pos.x = this.options.constraint.right;\n }\n }\n animate.left = Math.floor(pos.x) + \"px\";\n }\n\n this.animator = Animate(this._el.move, animate);\n\n this.fire(\"momentum\", this.data);\n }\n}\n\nclassMixin(Events)","/*\tDOMEvent\n\tInspired by Leaflet \n\tDomEvent contains functions for working with DOM events.\n================================================== */\nimport { Draggable } from \"../ui/Draggable\"\nimport { touch as BROWSER_TOUCH } from \"../core/Browser\";\nimport { stamp } from \"../core/Util\"\n\nvar DOMEvent = {\n\t/* inpired by John Resig, Dean Edwards and YUI addEvent implementations */\n\taddListener: function (/*HTMLElement*/ obj, /*String*/ type, /*Function*/ fn, /*Object*/ context) {\n\t\tvar id = stamp(fn),\n key = \"_tl_\" + type + id;\n\n\t\tif (obj[key]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar handler = function (e) {\n\t\t\treturn fn.call(context || obj, e || DOMEvent._getEvent());\n\t\t};\n\n\t\tif (BROWSER_TOUCH && type === \"dblclick\" && this.addDoubleTapListener) {\n this.addDoubleTapListener(obj, handler, id);\n } else if (\"addEventListener\" in obj) {\n if (type === \"mousewheel\") {\n obj.addEventListener(\"DOMMouseScroll\", handler, false);\n obj.addEventListener(type, handler, false);\n } else if (type === \"mouseenter\" || type === \"mouseleave\") {\n var originalHandler = handler,\n newType = type === \"mouseenter\" ? \"mouseover\" : \"mouseout\";\n handler = function(e) {\n if (!DOMEvent._checkMouse(obj, e)) {\n return;\n }\n return originalHandler(e);\n };\n obj.addEventListener(newType, handler, false);\n } else {\n obj.addEventListener(type, handler, false);\n }\n } else if (\"attachEvent\" in obj) {\n obj.attachEvent(\"on\" + type, handler);\n }\n\n\t\tobj[key] = handler;\n\t},\n\n\tremoveListener: function (/*HTMLElement*/ obj, /*String*/ type, /*Function*/ fn) {\n\t\tvar id = stamp(fn),\n key = \"_tl_\" + type + id,\n handler = obj[key];\n\n\t\tif (!handler) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (BROWSER_TOUCH && (type === 'dblclick') && this.removeDoubleTapListener) {\n\t\t\tthis.removeDoubleTapListener(obj, id);\n\t\t} else if ('removeEventListener' in obj) {\n\t\t\tif (type === 'mousewheel') {\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\n\t\t\t\tobj.removeEventListener(type, handler, false);\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\n\t\t\t} else {\n\t\t\t\tobj.removeEventListener(type, handler, false);\n\t\t\t}\n\t\t} else if ('detachEvent' in obj) {\n\t\t\tobj.detachEvent(\"on\" + type, handler);\n\t\t}\n\t\tobj[key] = null;\n\t},\n\n\t_checkMouse: function (el, e) {\n\t\tvar related = e.relatedTarget;\n\n\t\tif (!related) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\twhile (related && (related !== el)) {\n\t\t\t\trelated = related.parentNode;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (related !== el);\n\t},\n\n\t/*jshint noarg:false */ // evil magic for IE\n\t_getEvent: function () {\n\t\tvar e = window.event;\n\t\tif (!e) {\n\t\t\tvar caller = arguments.callee.caller;\n\t\t\twhile (caller) {\n\t\t\t\te = caller['arguments'][0];\n\t\t\t\tif (e && window.Event === e.constructor) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcaller = caller.caller;\n\t\t\t}\n\t\t}\n\t\treturn e;\n\t},\n\t/*jshint noarg:false */\n\n\tstopPropagation: function (/*Event*/ e) {\n\t\tif (e.stopPropagation) {\n\t\t\te.stopPropagation();\n\t\t} else {\n\t\t\te.cancelBubble = true;\n\t\t}\n\t},\n\t\n\tdisableClickPropagation: function (/*HTMLElement*/ el) {\n\t\tDOMEvent.addListener(el, Draggable.START, DOMEvent.stopPropagation);\n\t\tDOMEvent.addListener(el, \"click\", DOMEvent.stopPropagation);\n\t\tDOMEvent.addListener(el, \"dblclick\", DOMEvent.stopPropagation);\n\t},\n\n\tpreventDefault: function (/*Event*/ e) {\n\t\tif (e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\n\tstop: function (e) {\n\t\tDOMEvent.preventDefault(e);\n\t\tDOMEvent.stopPropagation(e);\n\t},\n\n\n\tgetWheelDelta: function (e) {\n\t\tvar delta = 0;\n\t\tif (e.wheelDelta) {\n\t\t\tdelta = e.wheelDelta / 120;\n\t\t}\n\t\tif (e.detail) {\n\t\t\tdelta = -e.detail / 3;\n\t\t}\n\t\treturn delta;\n\t}\n};\n\nexport { DOMEvent }\n","var Zepto = (function() {\n var undefined, key, $, classList, emptyArray = [],\n slice = emptyArray.slice,\n filter = emptyArray.filter,\n document = window.document,\n elementDisplay = {},\n classCache = {},\n cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1, 'opacity': 1, 'z-index': 1, 'zoom': 1 },\n fragmentRE = /^\\s*<(\\w+|!)[^>]*>/,\n singleTagRE = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n rootNodeRE = /^(?:body|html)$/i,\n capitalRE = /([A-Z])/g,\n\n // special attributes that should be get/set via method calls\n methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],\n\n adjacencyOperators = ['after', 'prepend', 'before', 'append'],\n table = document.createElement('table'),\n tableRow = document.createElement('tr'),\n containers = {\n 'tr': document.createElement('tbody'),\n 'tbody': table,\n 'thead': table,\n 'tfoot': table,\n 'td': tableRow,\n 'th': tableRow,\n '*': document.createElement('div')\n },\n readyRE = /complete|loaded|interactive/,\n classSelectorRE = /^\\.([\\w-]+)$/,\n idSelectorRE = /^#([\\w-]*)$/,\n simpleSelectorRE = /^[\\w-]*$/,\n class2type = {},\n toString = class2type.toString,\n zepto = {},\n camelize, uniq,\n tempParent = document.createElement('div'),\n propMap = {\n 'tabindex': 'tabIndex',\n 'readonly': 'readOnly',\n 'for': 'htmlFor',\n 'class': 'className',\n 'maxlength': 'maxLength',\n 'cellspacing': 'cellSpacing',\n 'cellpadding': 'cellPadding',\n 'rowspan': 'rowSpan',\n 'colspan': 'colSpan',\n 'usemap': 'useMap',\n 'frameborder': 'frameBorder',\n 'contenteditable': 'contentEditable'\n },\n isArray = Array.isArray ||\n function(object) { return object instanceof Array }\n\n zepto.matches = function(element, selector) {\n if (!selector || !element || element.nodeType !== 1) return false\n var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector ||\n element.oMatchesSelector || element.matchesSelector\n if (matchesSelector) return matchesSelector.call(element, selector)\n // fall back to performing a selector:\n var match, parent = element.parentNode,\n temp = !parent\n if (temp)(parent = tempParent).appendChild(element)\n match = ~zepto.qsa(parent, selector).indexOf(element)\n temp && tempParent.removeChild(element)\n return match\n }\n\n function type(obj) {\n return obj == null ? String(obj) :\n class2type[toString.call(obj)] || \"object\"\n }\n\n function isFunction(value) { return type(value) == \"function\" }\n\n function isWindow(obj) { return obj != null && obj == obj.window }\n\n function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }\n\n function isObject(obj) { return type(obj) == \"object\" }\n\n function isPlainObject(obj) {\n return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype\n }\n\n function likeArray(obj) { return typeof obj.length == 'number' }\n\n function compact(array) { return filter.call(array, function(item) { return item != null }) }\n\n function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }\n camelize = function(str) { return str.replace(/-+(.)?/g, function(match, chr) { return chr ? chr.toUpperCase() : '' }) }\n\n function dasherize(str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase()\n }\n uniq = function(array) { return filter.call(array, function(item, idx) { return array.indexOf(item) == idx }) }\n\n function classRE(name) {\n return name in classCache ?\n classCache[name] : (classCache[name] = new RegExp('(^|\\\\s)' + name + '(\\\\s|$)'))\n }\n\n function maybeAddPx(name, value) {\n return (typeof value == \"number\" && !cssNumber[dasherize(name)]) ? value + \"px\" : value\n }\n\n function defaultDisplay(nodeName) {\n var element, display\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName)\n document.body.appendChild(element)\n display = getComputedStyle(element, '').getPropertyValue(\"display\")\n element.parentNode.removeChild(element)\n display == \"none\" && (display = \"block\")\n elementDisplay[nodeName] = display\n }\n return elementDisplay[nodeName]\n }\n\n function children(element) {\n return 'children' in element ?\n slice.call(element.children) :\n $.map(element.childNodes, function(node) { if (node.nodeType == 1) return node })\n }\n\n // `$.zepto.fragment` takes a html string and an optional tag name\n // to generate DOM nodes nodes from the given html string.\n // The generated DOM nodes are returned as an array.\n // This function can be overriden in plugins for example to make\n // it compatible with browsers that don't support the DOM fully.\n zepto.fragment = function(html, name, properties) {\n var dom, nodes, container\n\n // A special case optimization for a single tag\n if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))\n\n if (!dom) {\n if (html.replace) html = html.replace(tagExpanderRE, \"<$1></$2>\")\n if (name === undefined) name = fragmentRE.test(html) && RegExp.$1\n if (!(name in containers)) name = '*'\n\n container = containers[name]\n container.innerHTML = '' + html\n dom = $.each(slice.call(container.childNodes), function() {\n container.removeChild(this)\n })\n }\n\n if (isPlainObject(properties)) {\n nodes = $(dom)\n $.each(properties, function(key, value) {\n if (methodAttributes.indexOf(key) > -1) nodes[key](value)\n else nodes.attr(key, value)\n })\n }\n\n return dom\n }\n\n // `$.zepto.Z` swaps out the prototype of the given `dom` array\n // of nodes with `$.fn` and thus supplying all the Zepto functions\n // to the array. Note that `__proto__` is not supported on Internet\n // Explorer. This method can be overriden in plugins.\n zepto.Z = function(dom, selector) {\n dom = dom || []\n dom.__proto__ = $.fn\n dom.selector = selector || ''\n return dom\n }\n\n // `$.zepto.isZ` should return `true` if the given object is a Zepto\n // collection. This method can be overriden in plugins.\n zepto.isZ = function(object) {\n return object instanceof zepto.Z\n }\n\n // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and\n // takes a CSS selector and an optional context (and handles various\n // special cases).\n // This method can be overriden in plugins.\n zepto.init = function(selector, context) {\n var dom\n // If nothing given, return an empty Zepto collection\n if (!selector) return zepto.Z()\n // Optimize for string selectors\n else if (typeof selector == 'string') {\n selector = selector.trim()\n // If it's a html fragment, create nodes from it\n // Note: In both Chrome 21 and Firefox 15, DOM error 12\n // is thrown if the fragment doesn't begin with <\n if (selector[0] == '<' && fragmentRE.test(selector))\n dom = zepto.fragment(selector, RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // If it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // If a function is given, call it when the DOM is ready\n else if (isFunction(selector)) return $(document).ready(selector)\n // If a Zepto collection is given, just return it\n else if (zepto.isZ(selector)) return selector\n else {\n // normalize array if an array of nodes is given\n if (isArray(selector)) dom = compact(selector)\n // Wrap DOM nodes.\n else if (isObject(selector))\n dom = [selector], selector = null\n // If it's a html fragment, create nodes from it\n else if (fragmentRE.test(selector))\n dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // And last but no least, if it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // create a new Zepto collection from the nodes found\n return zepto.Z(dom, selector)\n }\n\n // `$` will be the base `Zepto` object. When calling this\n // function just call `$.zepto.init, which makes the implementation\n // details of selecting nodes and creating Zepto collections\n // patchable in plugins.\n $ = function(selector, context) {\n return zepto.init(selector, context)\n }\n\n function extend(target, source, deep) {\n for (key in source)\n if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n if (isPlainObject(source[key]) && !isPlainObject(target[key]))\n target[key] = {}\n if (isArray(source[key]) && !isArray(target[key]))\n target[key] = []\n extend(target[key], source[key], deep)\n } else if (source[key] !== undefined) target[key] = source[key]\n }\n\n // Copy all but undefined properties from one or more\n // objects to the `target` object.\n $.extend = function(target) {\n var deep, args = slice.call(arguments, 1)\n if (typeof target == 'boolean') {\n deep = target\n target = args.shift()\n }\n args.forEach(function(arg) { extend(target, arg, deep) })\n return target\n }\n\n // `$.zepto.qsa` is Zepto's CSS selector implementation which\n // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.\n // This method can be overriden in plugins.\n zepto.qsa = function(element, selector) {\n var found,\n maybeID = selector[0] == '#',\n maybeClass = !maybeID && selector[0] == '.',\n nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked\n isSimple = simpleSelectorRE.test(nameOnly)\n return (isDocument(element) && isSimple && maybeID) ?\n ((found = element.getElementById(nameOnly)) ? [found] : []) :\n (element.nodeType !== 1 && element.nodeType !== 9) ? [] :\n slice.call(\n isSimple && !maybeID ?\n maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class\n element.getElementsByTagName(selector) : // Or a tag\n element.querySelectorAll(selector) // Or it's not simple, and we need to query all\n )\n }\n\n function filtered(nodes, selector) {\n return selector == null ? $(nodes) : $(nodes).filter(selector)\n }\n\n $.contains = function(parent, node) {\n return parent !== node && parent.contains(node)\n }\n\n function funcArg(context, arg, idx, payload) {\n return isFunction(arg) ? arg.call(context, idx, payload) : arg\n }\n\n function setAttribute(node, name, value) {\n value == null ? node.removeAttribute(name) : node.setAttribute(name, value)\n }\n\n // access className property while respecting SVGAnimatedString\n function className(node, value) {\n var klass = node.className,\n svg = klass && klass.baseVal !== undefined\n\n if (value === undefined) return svg ? klass.baseVal : klass\n svg ? (klass.baseVal = value) : (node.className = value)\n }\n\n // \"true\" => true\n // \"false\" => false\n // \"null\" => null\n // \"42\" => 42\n // \"42.5\" => 42.5\n // \"08\" => \"08\"\n // JSON => parse if valid\n // String => self\n function deserializeValue(value) {\n var num\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !/^0/.test(value) && !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value) :\n value\n } catch (e) {\n return value\n }\n }\n\n $.type = type\n $.isFunction = isFunction\n $.isWindow = isWindow\n $.isArray = isArray\n $.isPlainObject = isPlainObject\n\n $.isEmptyObject = function(obj) {\n var name\n for (name in obj) return false\n return true\n }\n\n $.inArray = function(elem, array, i) {\n return emptyArray.indexOf.call(array, elem, i)\n }\n\n $.camelCase = camelize\n $.trim = function(str) {\n return str == null ? \"\" : String.prototype.trim.call(str)\n }\n\n // plugin compatibility\n $.uuid = 0\n $.support = {}\n $.expr = {}\n\n $.map = function(elements, callback) {\n var value, values = [],\n i, key\n if (likeArray(elements))\n for (i = 0; i < elements.length; i++) {\n value = callback(elements[i], i)\n if (value != null) values.push(value)\n }\n else\n for (key in elements) {\n value = callback(elements[key], key)\n if (value != null) values.push(value)\n }\n return flatten(values)\n }\n\n $.each = function(elements, callback) {\n var i, key\n if (likeArray(elements)) {\n for (i = 0; i < elements.length; i++)\n if (callback.call(elements[i], i, elements[i]) === false) return elements\n } else {\n for (key in elements)\n if (callback.call(elements[key], key, elements[key]) === false) return elements\n }\n\n return elements\n }\n\n $.grep = function(elements, callback) {\n return filter.call(elements, callback)\n }\n\n if (window.JSON) $.parseJSON = JSON.parse\n\n // Populate the class2type map\n $.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase()\n })\n\n // Define methods that will be available on all\n // Zepto collections\n $.fn = {\n // Because a collection acts like an array\n // copy over these useful array functions.\n forEach: emptyArray.forEach,\n reduce: emptyArray.reduce,\n push: emptyArray.push,\n sort: emptyArray.sort,\n indexOf: emptyArray.indexOf,\n concat: emptyArray.concat,\n\n // `map` and `slice` in the jQuery API work differently\n // from their array counterparts\n map: function(fn) {\n return $($.map(this, function(el, i) { return fn.call(el, i, el) }))\n },\n slice: function() {\n return $(slice.apply(this, arguments))\n },\n\n ready: function(callback) {\n // need to check if document.body exists for IE as that browser reports\n // document ready when it hasn't yet created the body element\n if (readyRE.test(document.readyState) && document.body) callback($)\n else document.addEventListener('DOMContentLoaded', function() { callback($) }, false)\n return this\n },\n get: function(idx) {\n return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]\n },\n toArray: function() { return this.get() },\n size: function() {\n return this.length\n },\n remove: function() {\n return this.each(function() {\n if (this.parentNode != null)\n this.parentNode.removeChild(this)\n })\n },\n each: function(callback) {\n emptyArray.every.call(this, function(el, idx) {\n return callback.call(el, idx, el) !== false\n })\n return this\n },\n filter: function(selector) {\n if (isFunction(selector)) return this.not(this.not(selector))\n return $(filter.call(this, function(element) {\n return zepto.matches(element, selector)\n }))\n },\n add: function(selector, context) {\n return $(uniq(this.concat($(selector, context))))\n },\n is: function(selector) {\n return this.length > 0 && zepto.matches(this[0], selector)\n },\n not: function(selector) {\n var nodes = []\n if (isFunction(selector) && selector.call !== undefined)\n this.each(function(idx) {\n if (!selector.call(this, idx)) nodes.push(this)\n })\n else {\n var excludes = typeof selector == 'string' ? this.filter(selector) :\n (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)\n this.forEach(function(el) {\n if (excludes.indexOf(el) < 0) nodes.push(el)\n })\n }\n return $(nodes)\n },\n has: function(selector) {\n return this.filter(function() {\n return isObject(selector) ?\n $.contains(this, selector) :\n $(this).find(selector).size()\n })\n },\n eq: function(idx) {\n return idx === -1 ? this.slice(idx) : this.slice(idx, +idx + 1)\n },\n first: function() {\n var el = this[0]\n return el && !isObject(el) ? el : $(el)\n },\n last: function() {\n var el = this[this.length - 1]\n return el && !isObject(el) ? el : $(el)\n },\n find: function(selector) {\n var result, $this = this\n if (typeof selector == 'object')\n result = $(selector).filter(function() {\n var node = this\n return emptyArray.some.call($this, function(parent) {\n return $.contains(parent, node)\n })\n })\n else if (this.length == 1) result = $(zepto.qsa(this[0], selector))\n else result = this.map(function() { return zepto.qsa(this, selector) })\n return result\n },\n closest: function(selector, context) {\n var node = this[0],\n collection = false\n if (typeof selector == 'object') collection = $(selector)\n while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))\n node = node !== context && !isDocument(node) && node.parentNode\n return $(node)\n },\n parents: function(selector) {\n var ancestors = [],\n nodes = this\n while (nodes.length > 0)\n nodes = $.map(nodes, function(node) {\n if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {\n ancestors.push(node)\n return node\n }\n })\n return filtered(ancestors, selector)\n },\n parent: function(selector) {\n return filtered(uniq(this.pluck('parentNode')), selector)\n },\n children: function(selector) {\n return filtered(this.map(function() { return children(this) }), selector)\n },\n contents: function() {\n return this.map(function() { return slice.call(this.childNodes) })\n },\n siblings: function(selector) {\n return filtered(this.map(function(i, el) {\n return filter.call(children(el.parentNode), function(child) { return child !== el })\n }), selector)\n },\n empty: function() {\n return this.each(function() { this.innerHTML = '' })\n },\n // `pluck` is borrowed from Prototype.js\n pluck: function(property) {\n return $.map(this, function(el) { return el[property] })\n },\n show: function() {\n return this.each(function() {\n this.style.display == \"none\" && (this.style.display = '')\n if (getComputedStyle(this, '').getPropertyValue(\"display\") == \"none\")\n this.style.display = defaultDisplay(this.nodeName)\n })\n },\n replaceWith: function(newContent) {\n return this.before(newContent).remove()\n },\n wrap: function(structure) {\n var func = isFunction(structure)\n if (this[0] && !func)\n var dom = $(structure).get(0),\n clone = dom.parentNode || this.length > 1\n\n return this.each(function(index) {\n $(this).wrapAll(\n func ? structure.call(this, index) :\n clone ? dom.cloneNode(true) : dom\n )\n })\n },\n wrapAll: function(structure) {\n if (this[0]) {\n $(this[0]).before(structure = $(structure))\n var children\n // drill down to the inmost element\n while ((children = structure.children()).length) structure = children.first()\n $(structure).append(this)\n }\n return this\n },\n wrapInner: function(structure) {\n var func = isFunction(structure)\n return this.each(function(index) {\n var self = $(this),\n contents = self.contents(),\n dom = func ? structure.call(this, index) : structure\n contents.length ? contents.wrapAll(dom) : self.append(dom)\n })\n },\n unwrap: function() {\n this.parent().each(function() {\n $(this).replaceWith($(this).children())\n })\n return this\n },\n clone: function() {\n return this.map(function() { return this.cloneNode(true) })\n },\n hide: function() {\n return this.css(\"display\", \"none\")\n },\n toggle: function(setting) {\n return this.each(function() {\n var el = $(this);\n (setting === undefined ? el.css(\"display\") == \"none\" : setting) ? el.show(): el.hide()\n })\n },\n prev: function(selector) { return $(this.pluck('previousElementSibling')).filter(selector || '*') },\n next: function(selector) { return $(this.pluck('nextElementSibling')).filter(selector || '*') },\n html: function(html) {\n return arguments.length === 0 ?\n (this.length > 0 ? this[0].innerHTML : null) :\n this.each(function(idx) {\n var originHtml = this.innerHTML\n $(this).empty().append(funcArg(this, html, idx, originHtml))\n })\n },\n text: function(text) {\n return arguments.length === 0 ?\n (this.length > 0 ? this[0].textContent : null) :\n this.each(function() { this.textContent = (text === undefined) ? '' : '' + text })\n },\n attr: function(name, value) {\n var result\n return (typeof name == 'string' && value === undefined) ?\n (this.length == 0 || this[0].nodeType !== 1 ? undefined :\n (name == 'value' && this[0].nodeName == 'INPUT') ? this.val() :\n (!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result\n ) :\n this.each(function(idx) {\n if (this.nodeType !== 1) return\n if (isObject(name))\n for (key in name) setAttribute(this, key, name[key])\n else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))\n })\n },\n removeAttr: function(name) {\n return this.each(function() { this.nodeType === 1 && setAttribute(this, name) })\n },\n prop: function(name, value) {\n name = propMap[name] || name\n return (value === undefined) ?\n (this[0] && this[0][name]) :\n this.each(function(idx) {\n this[name] = funcArg(this, value, idx, this[name])\n })\n },\n data: function(name, value) {\n var data = this.attr('data-' + name.replace(capitalRE, '-$1').toLowerCase(), value)\n return data !== null ? deserializeValue(data) : undefined\n },\n val: function(value) {\n return arguments.length === 0 ?\n (this[0] && (this[0].multiple ?\n $(this[0]).find('option').filter(function() { return this.selected }).pluck('value') :\n this[0].value)) :\n this.each(function(idx) {\n this.value = funcArg(this, value, idx, this.value)\n })\n },\n offset: function(coordinates) {\n if (coordinates) return this.each(function(index) {\n var $this = $(this),\n coords = funcArg(this, coordinates, index, $this.offset()),\n parentOffset = $this.offsetParent().offset(),\n props = {\n top: coords.top - parentOffset.top,\n left: coords.left - parentOffset.left\n }\n\n if ($this.css('position') == 'static') props['position'] = 'relative'\n $this.css(props)\n })\n if (this.length == 0) return null\n var obj = this[0].getBoundingClientRect()\n return {\n left: obj.left + window.pageXOffset,\n top: obj.top + window.pageYOffset,\n width: Math.round(obj.width),\n height: Math.round(obj.height)\n }\n },\n css: function(property, value) {\n if (arguments.length < 2) {\n var element = this[0],\n computedStyle = getComputedStyle(element, '')\n if (!element) return\n if (typeof property == 'string')\n return element.style[camelize(property)] || computedStyle.getPropertyValue(property)\n else if (isArray(property)) {\n var props = {}\n $.each(isArray(property) ? property : [property], function(_, prop) {\n props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))\n })\n return props\n }\n }\n\n var css = ''\n if (type(property) == 'string') {\n if (!value && value !== 0)\n this.each(function() { this.style.removeProperty(dasherize(property)) })\n else\n css = dasherize(property) + \":\" + maybeAddPx(property, value)\n } else {\n for (key in property)\n if (!property[key] && property[key] !== 0)\n this.each(function() { this.style.removeProperty(dasherize(key)) })\n else\n css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'\n }\n\n return this.each(function() { this.style.cssText += ';' + css })\n },\n index: function(element) {\n return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])\n },\n hasClass: function(name) {\n if (!name) return false\n return emptyArray.some.call(this, function(el) {\n return this.test(className(el))\n }, classRE(name))\n },\n addClass: function(name) {\n if (!name) return this\n return this.each(function(idx) {\n classList = []\n var cls = className(this),\n newName = funcArg(this, name, idx, cls)\n newName.split(/\\s+/g).forEach(function(klass) {\n if (!$(this).hasClass(klass)) classList.push(klass)\n }, this)\n classList.length && className(this, cls + (cls ? \" \" : \"\") + classList.join(\" \"))\n })\n },\n removeClass: function(name) {\n return this.each(function(idx) {\n if (name === undefined) return className(this, '')\n classList = className(this)\n funcArg(this, name, idx, classList).split(/\\s+/g).forEach(function(klass) {\n classList = classList.replace(classRE(klass), \" \")\n })\n className(this, classList.trim())\n })\n },\n toggleClass: function(name, when) {\n if (!name) return this\n return this.each(function(idx) {\n var $this = $(this),\n names = funcArg(this, name, idx, className(this))\n names.split(/\\s+/g).forEach(function(klass) {\n (when === undefined ? !$this.hasClass(klass) : when) ?\n $this.addClass(klass): $this.removeClass(klass)\n })\n })\n },\n scrollTop: function(value) {\n if (!this.length) return\n var hasScrollTop = 'scrollTop' in this[0]\n if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset\n return this.each(hasScrollTop ?\n function() { this.scrollTop = value } :\n function() { this.scrollTo(this.scrollX, value) })\n },\n scrollLeft: function(value) {\n if (!this.length) return\n var hasScrollLeft = 'scrollLeft' in this[0]\n if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset\n return this.each(hasScrollLeft ?\n function() { this.scrollLeft = value } :\n function() { this.scrollTo(value, this.scrollY) })\n },\n position: function() {\n if (!this.length) return\n\n var elem = this[0],\n // Get *real* offsetParent\n offsetParent = this.offsetParent(),\n // Get correct offsets\n offset = this.offset(),\n parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()\n\n // Subtract element margins\n // note: when an element has margin: auto the offsetLeft and marginLeft\n // are the same in Safari causing offset.left to incorrectly be 0\n offset.top -= parseFloat($(elem).css('margin-top')) || 0\n offset.left -= parseFloat($(elem).css('margin-left')) || 0\n\n // Add offsetParent borders\n parentOffset.top += parseFloat($(offsetParent[0]).css('border-top-width')) || 0\n parentOffset.left += parseFloat($(offsetParent[0]).css('border-left-width')) || 0\n\n // Subtract the two offsets\n return {\n top: offset.top - parentOffset.top,\n left: offset.left - parentOffset.left\n }\n },\n offsetParent: function() {\n return this.map(function() {\n var parent = this.offsetParent || document.body\n while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css(\"position\") == \"static\")\n parent = parent.offsetParent\n return parent\n })\n }\n }\n\n // for now\n $.fn.detach = $.fn.remove\n\n // Generate the `width` and `height` functions\n ;\n ['width', 'height'].forEach(function(dimension) {\n var dimensionProperty =\n dimension.replace(/./, function(m) { return m[0].toUpperCase() })\n\n $.fn[dimension] = function(value) {\n var offset, el = this[0]\n if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :\n isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :\n (offset = this.offset()) && offset[dimension]\n else return this.each(function(idx) {\n el = $(this)\n el.css(dimension, funcArg(this, value, idx, el[dimension]()))\n })\n }\n })\n\n function traverseNode(node, fun) {\n fun(node)\n for (var key in node.childNodes) traverseNode(node.childNodes[key], fun)\n }\n\n // Generate the `after`, `prepend`, `before`, `append`,\n // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.\n adjacencyOperators.forEach(function(operator, operatorIndex) {\n var inside = operatorIndex % 2 //=> prepend, append\n\n $.fn[operator] = function() {\n // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings\n var argType, nodes = $.map(arguments, function(arg) {\n argType = type(arg)\n return argType == \"object\" || argType == \"array\" || arg == null ?\n arg : zepto.fragment(arg)\n }),\n parent, copyByClone = this.length > 1\n if (nodes.length < 1) return this\n\n return this.each(function(_, target) {\n parent = inside ? target : target.parentNode\n\n // convert all methods to a \"before\" operation\n target = operatorIndex == 0 ? target.nextSibling :\n operatorIndex == 1 ? target.firstChild :\n operatorIndex == 2 ? target :\n null\n\n nodes.forEach(function(node) {\n if (copyByClone) node = node.cloneNode(true)\n else if (!parent) return $(node).remove()\n\n traverseNode(parent.insertBefore(node, target), function(el) {\n if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&\n (!el.type || el.type === 'text/javascript') && !el.src)\n window['eval'].call(window, el.innerHTML)\n })\n })\n })\n }\n\n // after => insertAfter\n // prepend => prependTo\n // before => insertBefore\n // append => appendTo\n $.fn[inside ? operator + 'To' : 'insert' + (operatorIndex ? 'Before' : 'After')] = function(html) {\n $(html)[operator](this)\n return this\n }\n })\n\n zepto.Z.prototype = $.fn\n\n // Export internal API functions in the `$.zepto` namespace\n zepto.uniq = uniq\n zepto.deserializeValue = deserializeValue\n $.zepto = zepto\n\n return $\n})()\n\nwindow.Zepto = Zepto\nwindow.$ === undefined && (window.$ = Zepto)\n\n;\n(function($) {\n var $$ = $.zepto.qsa,\n _zid = 1,\n undefined,\n slice = Array.prototype.slice,\n isFunction = $.isFunction,\n isString = function(obj) { return typeof obj == 'string' },\n handlers = {},\n specialEvents = {},\n focusinSupported = 'onfocusin' in window,\n focus = { focus: 'focusin', blur: 'focusout' },\n hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }\n\n specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'\n\n function zid(element) {\n return element._zid || (element._zid = _zid++)\n }\n\n function findHandlers(element, event, fn, selector) {\n event = parse(event)\n if (event.ns) var matcher = matcherFor(event.ns)\n return (handlers[zid(element)] || []).filter(function(handler) {\n return handler &&\n (!event.e || handler.e == event.e) &&\n (!event.ns || matcher.test(handler.ns)) &&\n (!fn || zid(handler.fn) === zid(fn)) &&\n (!selector || handler.sel == selector)\n })\n }\n\n function parse(event) {\n var parts = ('' + event).split('.')\n return { e: parts[0], ns: parts.slice(1).sort().join(' ') }\n }\n\n function matcherFor(ns) {\n return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')\n }\n\n function eventCapture(handler, captureSetting) {\n return handler.del &&\n (!focusinSupported && (handler.e in focus)) ||\n !!captureSetting\n }\n\n function realEvent(type) {\n return hover[type] || (focusinSupported && focus[type]) || type\n }\n\n function add(element, events, fn, data, selector, delegator, capture) {\n var id = zid(element),\n set = (handlers[id] || (handlers[id] = []))\n events.split(/\\s/).forEach(function(event) {\n if (event == 'ready') return $(document).ready(fn)\n var handler = parse(event)\n handler.fn = fn\n handler.sel = selector\n // emulate mouseenter, mouseleave\n if (handler.e in hover) fn = function(e) {\n var related = e.relatedTarget\n if (!related || (related !== this && !$.contains(this, related)))\n return handler.fn.apply(this, arguments)\n }\n handler.del = delegator\n var callback = delegator || fn\n handler.proxy = function(e) {\n e = compatible(e)\n if (e.isImmediatePropagationStopped()) return\n e.data = data\n var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))\n if (result === false) e.preventDefault(), e.stopPropagation()\n return result\n }\n handler.i = set.length\n set.push(handler)\n if ('addEventListener' in element)\n element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n }\n\n function remove(element, events, fn, selector, capture) {\n var id = zid(element);\n (events || '').split(/\\s/).forEach(function(event) {\n findHandlers(element, event, fn, selector).forEach(function(handler) {\n delete handlers[id][handler.i]\n if ('removeEventListener' in element)\n element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n })\n }\n\n $.event = { add: add, remove: remove }\n\n $.proxy = function(fn, context) {\n if (isFunction(fn)) {\n var proxyFn = function() { return fn.apply(context, arguments) }\n proxyFn._zid = zid(fn)\n return proxyFn\n } else if (isString(context)) {\n return $.proxy(fn[context], fn)\n } else {\n throw new TypeError(\"expected function\")\n }\n }\n\n $.fn.bind = function(event, data, callback) {\n return this.on(event, data, callback)\n }\n $.fn.unbind = function(event, callback) {\n return this.off(event, callback)\n }\n $.fn.one = function(event, selector, data, callback) {\n return this.on(event, selector, data, callback, 1)\n }\n\n var returnTrue = function() { return true },\n returnFalse = function() { return false },\n ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$)/,\n eventMethods = {\n preventDefault: 'isDefaultPrevented',\n stopImmediatePropagation: 'isImmediatePropagationStopped',\n stopPropagation: 'isPropagationStopped'\n }\n\n function compatible(event, source) {\n if (source || !event.isDefaultPrevented) {\n source || (source = event)\n\n $.each(eventMethods, function(name, predicate) {\n var sourceMethod = source[name]\n event[name] = function() {\n this[predicate] = returnTrue\n return sourceMethod && sourceMethod.apply(source, arguments)\n }\n event[predicate] = returnFalse\n })\n\n if (source.defaultPrevented !== undefined ? source.defaultPrevented :\n 'returnValue' in source ? source.returnValue === false :\n source.getPreventDefault && source.getPreventDefault())\n event.isDefaultPrevented = returnTrue\n }\n return event\n }\n\n function createProxy(event) {\n var key, proxy = { originalEvent: event }\n for (key in event)\n if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]\n\n return compatible(proxy, event)\n }\n\n $.fn.delegate = function(selector, event, callback) {\n return this.on(event, selector, callback)\n }\n $.fn.undelegate = function(selector, event, callback) {\n return this.off(event, selector, callback)\n }\n\n $.fn.live = function(event, callback) {\n $(document.body).delegate(this.selector, event, callback)\n return this\n }\n $.fn.die = function(event, callback) {\n $(document.body).undelegate(this.selector, event, callback)\n return this\n }\n\n $.fn.on = function(event, selector, data, callback, one) {\n var autoRemove, delegator, $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn) {\n $this.on(type, selector, data, fn, one)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = data, data = selector, selector = undefined\n if (isFunction(data) || data === false)\n callback = data, data = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(_, element) {\n if (one) autoRemove = function(e) {\n remove(element, e.type, callback)\n return callback.apply(this, arguments)\n }\n\n if (selector) delegator = function(e) {\n var evt, match = $(e.target).closest(selector, element).get(0)\n if (match && match !== element) {\n evt = $.extend(createProxy(e), { currentTarget: match, liveFired: element })\n return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))\n }\n }\n\n add(element, event, callback, data, selector, delegator || autoRemove)\n })\n }\n $.fn.off = function(event, selector, callback) {\n var $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn) {\n $this.off(type, selector, fn)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = selector, selector = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function() {\n remove(this, event, callback, selector)\n })\n }\n\n $.fn.trigger = function(event, args) {\n event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)\n event._args = args\n return this.each(function() {\n // items in the collection might not be DOM elements\n if ('dispatchEvent' in this) this.dispatchEvent(event)\n else $(this).triggerHandler(event, args)\n })\n }\n\n // triggers event handlers on current element just as if an event occurred,\n // doesn't trigger an actual event, doesn't bubble\n $.fn.triggerHandler = function(event, args) {\n var e, result\n this.each(function(i, element) {\n e = createProxy(isString(event) ? $.Event(event) : event)\n e._args = args\n e.target = element\n $.each(findHandlers(element, event.type || event), function(i, handler) {\n result = handler.proxy(e)\n if (e.isImmediatePropagationStopped()) return false\n })\n })\n return result\n }\n\n // shortcut methods for `.bind(event, fn)` for each event type\n ;\n ('focusin focusout load resize scroll unload click dblclick ' +\n 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave ' +\n 'change select keydown keypress keyup error').split(' ').forEach(function(event) {\n $.fn[event] = function(callback) {\n return callback ?\n this.bind(event, callback) :\n this.trigger(event)\n }\n })\n\n ;\n ['focus', 'blur'].forEach(function(name) {\n $.fn[name] = function(callback) {\n if (callback) this.bind(name, callback)\n else this.each(function() {\n try { this[name]() } catch (e) {}\n })\n return this\n }\n })\n\n $.Event = function(type, props) {\n if (!isString(type)) props = type, type = props.type\n var event = document.createEvent(specialEvents[type] || 'Events'),\n bubbles = true\n if (props)\n for (var name in props)(name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])\n event.initEvent(type, bubbles, true)\n return compatible(event)\n }\n\n})(Zepto)\n\n;\n(function($) {\n var jsonpID = 0,\n document = window.document,\n key,\n name,\n rscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n scriptTypeRE = /^(?:text|application)\\/javascript/i,\n xmlTypeRE = /^(?:text|application)\\/xml/i,\n jsonType = 'application/json',\n htmlType = 'text/html',\n blankRE = /^\\s*$/\n\n // trigger a custom event and return false if it was cancelled\n function triggerAndReturn(context, eventName, data) {\n var event = $.Event(eventName)\n $(context).trigger(event, data)\n return !event.isDefaultPrevented()\n }\n\n // trigger an Ajax \"global\" event\n function triggerGlobal(settings, context, eventName, data) {\n if (settings.global) return triggerAndReturn(context || document, eventName, data)\n }\n\n // Number of active Ajax requests\n $.active = 0\n\n function ajaxStart(settings) {\n if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')\n }\n\n function ajaxStop(settings) {\n if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')\n }\n\n // triggers an extra global event \"ajaxBeforeSend\" that's like \"ajaxSend\" but cancelable\n function ajaxBeforeSend(xhr, settings) {\n var context = settings.context\n if (settings.beforeSend.call(context, xhr, settings) === false ||\n triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)\n return false\n\n triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])\n }\n\n function ajaxSuccess(data, xhr, settings, deferred) {\n var context = settings.context,\n status = 'success'\n settings.success.call(context, data, status, xhr)\n if (deferred) deferred.resolveWith(context, [data, status, xhr])\n triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])\n ajaxComplete(status, xhr, settings)\n }\n // type: \"timeout\", \"error\", \"abort\", \"parsererror\"\n function ajaxError(error, type, xhr, settings, deferred) {\n var context = settings.context\n settings.error.call(context, xhr, type, error)\n if (deferred) deferred.rejectWith(context, [xhr, type, error])\n triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])\n ajaxComplete(type, xhr, settings)\n }\n // status: \"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", \"parsererror\"\n function ajaxComplete(status, xhr, settings) {\n var context = settings.context\n settings.complete.call(context, xhr, status)\n triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])\n ajaxStop(settings)\n }\n\n // Empty function, used as default callback\n function empty() {}\n\n $.ajaxJSONP = function(options, deferred) {\n if (!('type' in options)) return $.ajax(options)\n\n var _callbackName = options.jsonpCallback,\n callbackName = ($.isFunction(_callbackName) ?\n _callbackName() : _callbackName) || ('jsonp' + (++jsonpID)),\n script = document.createElement('script'),\n originalCallback = window[callbackName],\n responseData,\n abort = function(errorType) {\n $(script).triggerHandler('error', errorType || 'abort')\n },\n xhr = { abort: abort },\n abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n $(script).on('load error', function(e, errorType) {\n clearTimeout(abortTimeout)\n $(script).off().remove()\n\n if (e.type == 'error' || !responseData) {\n ajaxError(null, errorType || 'error', xhr, options, deferred)\n } else {\n ajaxSuccess(responseData[0], xhr, options, deferred)\n }\n\n window[callbackName] = originalCallback\n if (responseData && $.isFunction(originalCallback))\n originalCallback(responseData[0])\n\n originalCallback = responseData = undefined\n })\n\n if (ajaxBeforeSend(xhr, options) === false) {\n abort('abort')\n return xhr\n }\n\n window[callbackName] = function() {\n responseData = arguments\n }\n\n script.src = options.url.replace(/\\?(.+)=\\?/, '?$1=' + callbackName)\n document.head.appendChild(script)\n\n if (options.timeout > 0) abortTimeout = setTimeout(function() {\n abort('timeout')\n }, options.timeout)\n\n return xhr\n }\n\n $.ajaxSettings = {\n // Default type of request\n type: 'GET',\n // Callback that is executed before request\n beforeSend: empty,\n // Callback that is executed if the request succeeds\n success: empty,\n // Callback that is executed the the server drops error\n error: empty,\n // Callback that is executed on request complete (both: error and success)\n complete: empty,\n // The context for the callbacks\n context: null,\n // Whether to trigger \"global\" Ajax events\n global: true,\n // Transport\n xhr: function() {\n return new window.XMLHttpRequest()\n },\n // MIME types mapping\n // IIS returns Javascript as \"application/x-javascript\"\n accepts: {\n script: 'text/javascript, application/javascript, application/x-javascript',\n json: jsonType,\n xml: 'application/xml, text/xml',\n html: htmlType,\n text: 'text/plain'\n },\n // Whether the request is to another domain\n crossDomain: false,\n // Default timeout\n timeout: 0,\n // Whether data should be serialized to string\n processData: true,\n // Whether the browser should be allowed to cache GET responses\n cache: true\n }\n\n function mimeToDataType(mime) {\n if (mime) mime = mime.split(';', 2)[0]\n return mime && (mime == htmlType ? 'html' :\n mime == jsonType ? 'json' :\n scriptTypeRE.test(mime) ? 'script' :\n xmlTypeRE.test(mime) && 'xml') || 'text'\n }\n\n function appendQuery(url, query) {\n if (query == '') return url\n return (url + '&' + query).replace(/[&?]{1,2}/, '?')\n }\n\n // serialize payload and append it to the URL for GET requests\n function serializeData(options) {\n if (options.processData && options.data && $.type(options.data) != \"string\")\n options.data = $.param(options.data, options.traditional)\n if (options.data && (!options.type || options.type.toUpperCase() == 'GET'))\n options.url = appendQuery(options.url, options.data), options.data = undefined\n }\n\n $.ajax = function(options) {\n var settings = $.extend({}, options || {}),\n deferred = $.Deferred && $.Deferred()\n for (key in $.ajaxSettings)\n if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]\n\n ajaxStart(settings)\n\n if (!settings.crossDomain) settings.crossDomain = /^([\\w-]+:)?\\/\\/([^\\/]+)/.test(settings.url) &&\n RegExp.$2 != window.location.host\n\n if (!settings.url) settings.url = window.location.toString()\n serializeData(settings)\n if (settings.cache === false) settings.url = appendQuery(settings.url, '_=' + Date.now())\n\n var dataType = settings.dataType,\n hasPlaceholder = /\\?.+=\\?/.test(settings.url)\n if (dataType == 'jsonp' || hasPlaceholder) {\n if (!hasPlaceholder)\n settings.url = appendQuery(settings.url,\n settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')\n return $.ajaxJSONP(settings, deferred)\n }\n\n var mime = settings.accepts[dataType],\n headers = {},\n setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },\n protocol = /^([\\w-]+:)\\/\\//.test(settings.url) ? RegExp.$1 : window.location.protocol,\n xhr = settings.xhr(),\n nativeSetHeader = xhr.setRequestHeader,\n abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')\n setHeader('Accept', mime || '*/*')\n if (mime = settings.mimeType || mime) {\n if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]\n xhr.overrideMimeType && xhr.overrideMimeType(mime)\n }\n if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))\n setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')\n\n if (settings.headers)\n for (name in settings.headers) setHeader(name, settings.headers[name])\n xhr.setRequestHeader = setHeader\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty\n clearTimeout(abortTimeout)\n var result, error = false\n if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {\n dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))\n result = xhr.responseText\n\n try {\n // http://perfectionkills.com/global-eval-what-are-the-options/\n if (dataType == 'script')(1, eval)(result)\n else if (dataType == 'xml') result = xhr.responseXML\n else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)\n } catch (e) { error = e }\n\n if (error) ajaxError(error, 'parsererror', xhr, settings, deferred)\n else ajaxSuccess(result, xhr, settings, deferred)\n } else {\n ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)\n }\n }\n }\n\n if (ajaxBeforeSend(xhr, settings) === false) {\n xhr.abort()\n ajaxError(null, 'abort', xhr, settings, deferred)\n return xhr\n }\n\n if (settings.xhrFields)\n for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]\n\n var async = 'async' in settings ? settings.async : true\n xhr.open(settings.type, settings.url, async, settings.username, settings.password)\n\n for (name in headers) nativeSetHeader.apply(xhr, headers[name])\n\n if (settings.timeout > 0) abortTimeout = setTimeout(function() {\n xhr.onreadystatechange = empty\n xhr.abort()\n ajaxError(null, 'timeout', xhr, settings, deferred)\n }, settings.timeout)\n\n // avoid sending empty string (#319)\n xhr.send(settings.data ? settings.data : null)\n return xhr\n }\n\n // handle optional data/success arguments\n function parseArguments(url, data, success, dataType) {\n var hasData = !$.isFunction(data)\n return {\n url: url,\n data: hasData ? data : undefined,\n success: !hasData ? data : $.isFunction(success) ? success : undefined,\n dataType: hasData ? dataType || success : success\n }\n }\n\n $.get = function(url, data, success, dataType) {\n return $.ajax(parseArguments.apply(null, arguments))\n }\n\n $.post = function(url, data, success, dataType) {\n var options = parseArguments.apply(null, arguments)\n options.type = 'POST'\n return $.ajax(options)\n }\n\n $.getJSON = function(url, data, success) {\n var options = parseArguments.apply(null, arguments)\n options.dataType = 'json'\n return $.ajax(options)\n }\n\n /**\n * Add a promisified option to better handle cases where we need the data \n * synchronously.\n * @param {String} url \n */\n $.fetchJSON = function(url) {\n var request = new XMLHttpRequest();\n return new Promise(function(resolve, reject) {\n // Setup our listener to process compeleted requests\n request.onreadystatechange = function() {\n try {\n // Only run if the request is complete\n if (request.readyState !== 4) return;\n\n // Process the response\n if (request.status >= 200 && request.status < 300) {\n var json = JSON.parse(request.responseText)\n resolve(json);\n } else {\n reject({\n status: request.status,\n statusText: request.statusText\n });\n }\n\n } catch (e) {\n reject({\n status: 400,\n statusText: `Error fetching JSON from ${url}: ${e}`\n });\n\n }\n };\n\n // Setup our HTTP request\n request.open('GET', url, true);\n\n // Send the request\n request.send();\n })\n }\n\n\n $.fn.load = function(url, data, success) {\n if (!this.length) return this\n var self = this,\n parts = url.split(/\\s/),\n selector,\n options = parseArguments(url, data, success),\n callback = options.success\n if (parts.length > 1) options.url = parts[0], selector = parts[1]\n options.success = function(response) {\n self.html(selector ?\n $('<div>').html(response.replace(rscript, \"\")).find(selector) :\n response)\n callback && callback.apply(self, arguments)\n }\n $.ajax(options)\n return this\n }\n\n var escape = encodeURIComponent\n\n function serialize(params, obj, traditional, scope) {\n var type, array = $.isArray(obj),\n hash = $.isPlainObject(obj)\n $.each(obj, function(key, value) {\n type = $.type(value)\n if (scope) key = traditional ? scope :\n scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'\n // handle data in serializeArray() format\n if (!scope && array) params.add(value.name, value.value)\n // recurse into nested objects\n else if (type == \"array\" || (!traditional && type == \"object\"))\n serialize(params, value, traditional, key)\n else params.add(key, value)\n })\n }\n\n $.param = function(obj, traditional) {\n var params = []\n params.add = function(k, v) { this.push(escape(k) + '=' + escape(v)) }\n serialize(params, obj, traditional)\n return params.join('&').replace(/%20/g, '+')\n }\n})(Zepto)\n\n;\n(function($) {\n $.fn.serializeArray = function() {\n var result = [],\n el\n $([].slice.call(this.get(0).elements)).each(function() {\n el = $(this)\n var type = el.attr('type')\n if (this.nodeName.toLowerCase() != 'fieldset' &&\n !this.disabled && type != 'submit' && type != 'reset' && type != 'button' &&\n ((type != 'radio' && type != 'checkbox') || this.checked))\n result.push({\n name: el.attr('name'),\n value: el.val()\n })\n })\n return result\n }\n\n $.fn.serialize = function() {\n var result = []\n this.serializeArray().forEach(function(elm) {\n result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))\n })\n return result.join('&')\n }\n\n $.fn.submit = function(callback) {\n if (callback) this.bind('submit', callback)\n else if (this.length) {\n var event = $.Event('submit')\n this.eq(0).trigger(event)\n if (!event.isDefaultPrevented()) this.get(0).submit()\n }\n return this\n }\n\n})(Zepto)\n\n;\n(function($) {\n // __proto__ doesn't exist on IE<11, so redefine\n // the Z function to use object extension instead\n if (!('__proto__' in {})) {\n $.extend($.zepto, {\n Z: function(dom, selector) {\n dom = dom || []\n $.extend(dom, $.fn)\n dom.selector = selector || ''\n dom.__Z = true\n return dom\n },\n // this is a kludge but works\n isZ: function(object) {\n return $.type(object) === 'array' && '__Z' in object\n }\n })\n }\n\n // getComputedStyle shouldn't freak out when called\n // without a valid element as argument\n try {\n getComputedStyle(undefined)\n } catch (e) {\n var nativeGetComputedStyle = getComputedStyle;\n window.getComputedStyle = function(element, pseudoElement) {\n try {\n return nativeGetComputedStyle(element, pseudoElement)\n } catch (e) {\n return null\n }\n }\n }\n})(Zepto)\n\nexport const getJSON = Zepto.getJSON;\nexport const ajax = Zepto.ajax;\nexport const fetchJSON = Zepto.fetchJSON;\n\n// Based on https://github.com/madrobby/zepto/blob/5585fe00f1828711c04208372265a5d71e3238d1/src/ajax.js\n// Zepto.js\n// (c) 2010-2012 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n/*\nCopyright (c) 2010-2012 Thomas Fuchs\nhttp://zeptojs.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal \nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE \nSOFTWARE.\n*/","/*\tDate\n\tDate object\n\tMONTHS are 1-BASED, not 0-BASED (different from Javascript date objects)\n================================================== */\nimport { TLClass } from \"../core/TLClass\"\nimport { Language } from \"../language/Language\"\nimport TLError from \"../core/TLError\"\n\nimport { mergeData, trim, trace } from \"../core/Util\"\n\n//\n// Class for human dates\n//\n\nexport const SCALES = [\n // ( name, units_per_tick, flooring function )\n [\"millisecond\", 1, function(d) {}],\n [\n \"second\",\n 1000,\n function(d) {\n d.setMilliseconds(0);\n }\n ],\n [\n \"minute\",\n 1000 * 60,\n function(d) {\n d.setSeconds(0);\n }\n ],\n [\n \"hour\",\n 1000 * 60 * 60,\n function(d) {\n d.setMinutes(0);\n }\n ],\n [\n \"day\",\n 1000 * 60 * 60 * 24,\n function(d) {\n d.setHours(0);\n }\n ],\n [\n \"month\",\n 1000 * 60 * 60 * 24 * 30,\n function(d) {\n d.setDate(1);\n }\n ],\n [\n \"year\",\n 1000 * 60 * 60 * 24 * 365,\n function(d) {\n d.setMonth(0);\n }\n ],\n [\n \"decade\",\n 1000 * 60 * 60 * 24 * 365 * 10,\n function(d) {\n var real_year = d.getFullYear();\n d.setFullYear(real_year - (real_year % 10));\n }\n ],\n [\n \"century\",\n 1000 * 60 * 60 * 24 * 365 * 100,\n function(d) {\n var real_year = d.getFullYear();\n d.setFullYear(real_year - (real_year % 100));\n }\n ],\n [\n \"millennium\",\n 1000 * 60 * 60 * 24 * 365 * 1000,\n function(d) {\n var real_year = d.getFullYear();\n d.setFullYear(real_year - (real_year % 1000));\n }\n ]\n]\n\n// Date parts from highest to lowest precision\nconst DATE_PARTS = [\n \"millisecond\",\n \"second\",\n \"minute\",\n \"hour\",\n \"day\",\n \"month\",\n \"year\"\n];\n\nconst ISO8601_SHORT_PATTERN = /^([\\+-]?\\d+?)(-\\d{2}?)?(-\\d{2}?)?$/;\n\n// regex below from\n// http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/\nconst ISO8601_PATTERN = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\n\n/* For now, rather than extract parts from regexp, lets trust the browser.\n * Famous last words...\n * What about UTC vs local time?\n * see also http://stackoverflow.com/questions/10005374/ecmascript-5-date-parse-results-for-iso-8601-test-cases\n */\nfunction parseISODate(str) {\n var d = new Date(str); // this is a true JavaScript date, not a TLDate\n if (isNaN(d)) {\n throw new TLError(\"invalid_date_err\", str);\n }\n return {\n year: d.getFullYear(),\n month: d.getMonth() + 1,\n day: d.getDate(),\n hour: d.getHours(),\n minute: d.getMinutes(),\n second: d.getSeconds(),\n millisecond: d.getMilliseconds()\n };\n};\n\n\nconst BEST_DATEFORMATS = {\n base: {\n millisecond: \"time_short\",\n second: \"time\",\n minute: \"time_no_seconds_small_date\",\n hour: \"time_no_seconds_small_date\",\n day: \"full\",\n month: \"month\",\n year: \"year\",\n decade: \"year\",\n century: \"year\",\n millennium: \"year\",\n age: \"fallback\",\n epoch: \"fallback\",\n era: \"fallback\",\n eon: \"fallback\",\n eon2: \"fallback\"\n },\n\n short: {\n millisecond: \"time_short\",\n second: \"time_short\",\n minute: \"time_no_seconds_short\",\n hour: \"time_no_minutes_short\",\n day: \"full_short\",\n month: \"month_short\",\n year: \"year\",\n decade: \"year\",\n century: \"year\",\n millennium: \"year\",\n age: \"fallback\",\n epoch: \"fallback\",\n era: \"fallback\",\n eon: \"fallback\",\n eon2: \"fallback\"\n }\n};\n\nexport const TLDate = TLClass.extend({\n // @data = ms, JS Date object, or JS dictionary with date properties\n initialize: function(data, format, format_short) {\n if (typeof data == \"number\") {\n this.data = {\n format: \"yyyy mmmm\",\n date_obj: new Date(data)\n };\n } else if (Date == data.constructor) {\n this.data = {\n format: \"yyyy mmmm\",\n date_obj: data\n };\n } else {\n this.data = JSON.parse(JSON.stringify(data)); // clone don't use by reference.\n this._createDateObj();\n }\n\n this._setFormat(format, format_short);\n },\n\n setDateFormat: function(format) {\n this.data.format = format;\n },\n\n getDisplayDate: function(language, format) {\n if (this.data.display_date) {\n return this.data.display_date;\n }\n if (!language) {\n language = Language.fallback;\n }\n if (language.constructor != Language) {\n trace(\n \"First argument to getDisplayDate must be type Language\"\n );\n language = Language.fallback;\n }\n\n var format_key = format || this.data.format;\n return language.formatDate(this.data.date_obj, format_key);\n },\n\n getMillisecond: function() {\n return this.getTime();\n },\n\n getTime: function() {\n return this.data.date_obj.getTime();\n },\n\n isBefore: function(other_date) {\n if (!this.data.date_obj.constructor ==\n other_date.data.date_obj.constructor\n ) {\n throw new TLError(\"date_compare_err\"); // but should be able to compare 'cosmological scale' dates once we get to that...\n }\n if (\"isBefore\" in this.data.date_obj) {\n return this.data.date_obj[\"isBefore\"](\n other_date.data.date_obj\n );\n }\n return this.data.date_obj < other_date.data.date_obj;\n },\n\n isAfter: function(other_date) {\n if (!this.data.date_obj.constructor ==\n other_date.data.date_obj.constructor\n ) {\n throw new TLError(\"date_compare_err\"); // but should be able to compare 'cosmological scale' dates once we get to that...\n }\n if (\"isAfter\" in this.data.date_obj) {\n return this.data.date_obj[\"isAfter\"](\n other_date.data.date_obj\n );\n }\n return this.data.date_obj > other_date.data.date_obj;\n },\n\n // Return a new TLDate which has been 'floored' at the given scale.\n // @scale = string value from SCALES\n floor: function(scale) {\n var d = new Date(this.data.date_obj.getTime());\n for (var i = 0; i < SCALES.length; i++) {\n // for JS dates, we iteratively apply flooring functions\n SCALES[i][2](d);\n if (SCALES[i][0] == scale) return new TLDate(d);\n }\n\n throw new TLError(\"invalid_scale_err\", scale);\n },\n\n /*\tPrivate Methods\n\t================================================== */\n\n _getDateData: function() {\n var _date = {\n year: 0,\n month: 1, // stupid JS dates\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0\n };\n\n // Merge data\n mergeData(_date, this.data);\n\n // Make strings into numbers\n for (var ix in DATE_PARTS) {\n var x = trim(_date[DATE_PARTS[ix]]);\n if (!x.match(/^-?\\d*$/)) {\n throw new TLError(\n \"invalid_date_err\",\n DATE_PARTS[ix] + \" = '\" + _date[DATE_PARTS[ix]] + \"'\"\n );\n }\n\n var parsed = parseInt(_date[DATE_PARTS[ix]]);\n if (isNaN(parsed)) {\n parsed = ix == 4 || ix == 5 ? 1 : 0; // month and day have diff baselines\n }\n _date[DATE_PARTS[ix]] = parsed;\n }\n\n if (_date.month > 0 && _date.month <= 12) {\n // adjust for JS's weirdness\n _date.month = _date.month - 1;\n }\n\n return _date;\n },\n\n _createDateObj: function() {\n var _date = this._getDateData();\n this.data.date_obj = new Date(\n _date.year,\n _date.month,\n _date.day,\n _date.hour,\n _date.minute,\n _date.second,\n _date.millisecond\n );\n if (this.data.date_obj.getFullYear() != _date.year) {\n // Javascript has stupid defaults for two-digit years\n this.data.date_obj.setFullYear(_date.year);\n }\n },\n\n /* Find Best Format\n * this may not work with 'cosmologic' dates, or with TLDate if we\n * support constructing them based on JS Date and time\n ================================================== */\n findBestFormat: function(variant) {\n var eval_array = DATE_PARTS,\n format = \"\";\n\n for (var i = 0; i < eval_array.length; i++) {\n if (this.data[eval_array[i]]) {\n if (variant) {\n if (!(variant in BEST_DATEFORMATS)) {\n variant = \"short\"; // legacy\n }\n } else {\n variant = \"base\";\n }\n return BEST_DATEFORMATS[variant][eval_array[i]];\n }\n }\n return \"\";\n },\n _setFormat: function(format, format_short) {\n if (format) {\n this.data.format = format;\n } else if (!this.data.format) {\n this.data.format = this.findBestFormat();\n }\n\n if (format_short) {\n this.data.format_short = format_short;\n } else if (!this.data.format_short) {\n this.data.format_short = this.findBestFormat(true);\n }\n }\n});\n\n// offer something that can figure out the right date class to return\nexport function makeDate(data) {\n var date = new TLDate(data);\n if (!isNaN(date.getTime())) {\n return date;\n }\n return new BigDate(data);\n}\n\nexport function parseDate(str) {\n if (str.match(ISO8601_SHORT_PATTERN)) {\n // parse short specifically to avoid timezone offset confusion\n // most browsers assume short is UTC, not local time.\n var parts = str.match(ISO8601_SHORT_PATTERN).slice(1);\n var d = { year: parts[0].replace(\"+\", \"\") }; // year can be negative\n if (parts[1]) {\n d[\"month\"] = parts[1].replace(\"-\", \"\");\n }\n if (parts[2]) {\n d[\"day\"] = parts[2].replace(\"-\", \"\");\n }\n return d;\n }\n\n if (str.match(ISO8601_PATTERN)) {\n return cls.parseISODate(str);\n }\n\n if (str.match(/^\\-?\\d+$/)) {\n return { year: str };\n }\n\n var parsed = {};\n if (str.match(/\\d+\\/\\d+\\/\\d+/)) {\n // mm/yy/dddd\n var date = str.match(/\\d+\\/\\d+\\/\\d+/)[0];\n str = trim(str.replace(date, \"\"));\n var date_parts = date.split(\"/\");\n parsed.month = date_parts[0];\n parsed.day = date_parts[1];\n parsed.year = date_parts[2];\n }\n\n if (str.match(/\\d+\\/\\d+/)) {\n // mm/yy\n var date = str.match(/\\d+\\/\\d+/)[0];\n str = trim(str.replace(date, \"\"));\n var date_parts = date.split(\"/\");\n parsed.month = date_parts[0];\n parsed.year = date_parts[1];\n }\n\n if (str.match(\":\")) {\n var time_parts = str.split(\":\");\n parsed.hour = time_parts[0];\n parsed.minute = time_parts[1];\n if (time_parts[2]) {\n let second_parts = time_parts[2].split(\".\");\n parsed.second = second_parts[0];\n parsed.millisecond = second_parts[1];\n }\n }\n return parsed;\n};\n\nexport const BigYear = TLClass.extend({\n initialize: function(year) {\n this.year = parseInt(year);\n if (isNaN(this.year)) {\n throw new TLError(\"invalid_year_err\", year);\n }\n },\n\n isBefore: function(that) {\n return this.year < that.year;\n },\n\n isAfter: function(that) {\n return this.year > that.year;\n },\n\n getTime: function() {\n return this.year;\n }\n});\n\n\n//\n// Class for cosmological dates\n//\n\n// cosmo units are years, not millis\nconst AGE = 1000000;\nconst EPOCH = AGE * 10;\nconst ERA = EPOCH * 10;\nconst EON = ERA * 10;\n\nfunction Floorer(unit) {\n return function(a_big_year) {\n var year = a_big_year.getTime();\n return new BigYear(Math.floor(year / unit) * unit);\n }\n}\n\n// cosmological scales\nexport const BIG_DATE_SCALES = [ // ( name, units_per_tick, flooring function )\n ['year', 1, new Floorer(1)],\n ['decade', 10, new Floorer(10)],\n ['century', 100, new Floorer(100)],\n ['millennium', 1000, new Floorer(1000)],\n ['age', AGE, new Floorer(AGE)], // 1M years\n ['epoch', EPOCH, new Floorer(EPOCH)], // 10M years\n ['era', ERA, new Floorer(ERA)], // 100M years\n ['eon', EON, new Floorer(EON)] // 1B years\n];\n\n\nexport const BigDate = TLDate.extend({\n // @data = BigYear object or JS dictionary with date properties\n initialize: function(data, format, format_short) {\n if (BigYear == data.constructor) {\n this.data = {\n date_obj: data\n };\n } else {\n this.data = JSON.parse(JSON.stringify(data));\n this._createDateObj();\n }\n\n this._setFormat(format, format_short);\n },\n\n // Create date_obj\n _createDateObj: function() {\n var _date = this._getDateData();\n this.data.date_obj = new BigYear(_date.year);\n },\n\n // Return a new BigDate which has been 'floored' at the given scale.\n // @scale = string value from BIG_DATE_SCALES\n floor: function(scale) {\n for (var i = 0; i < BIG_DATE_SCALES.length; i++) {\n if (BIG_DATE_SCALES[i][0] == scale) {\n var floored = BIG_DATE_SCALES[i][2](this.data.date_obj);\n return new BigDate(floored);\n }\n }\n\n throw new TLError(\"invalid_scale_err\", scale);\n }\n});","import { mergeData, pad, trace } from \"../core/Util\"\nimport { fetchJSON } from \"../net/Net\"\nimport { BigYear } from \"../date/TLDate\"\n\n/**\n * Instantiate a Language object to manage I18N. \n * WARNING: In general, this should not be called directly, because it doesn't block while\n * the language file is loaded, which can lead to race conditions in some cases. In most\n * cases, language objects other than the fallback should be gotten by calling the \n * async function loadLanguage defined elsewhere in this file.\n * \n * @param {String} [language=en] - a language code or a URL to a \n * translation file\n * @param {string} [script_path] - if `language` is not a URL, this is used\n * to construct a fully-qualified URL to load a translation file.\n */\nclass Language {\n constructor(language, script_path) {\n // borrowed from http://stackoverflow.com/a/14446414/102476\n for (let k in LANGUAGES.en) {\n this[k] = LANGUAGES.en[k];\n }\n // `language` won't be defined when the fallback is constructed\n if (language && typeof(language) == 'string' && language != 'en') {\n var code = language;\n if (!(code in LANGUAGES)) {\n console.log(`Expected language ${code} to be cached. Did you call the constructor directly?`)\n var url = buildLanguageURL(code, script_path);\n fetchJSON(url).then((json) => {\n LANGUAGES[code] = json\n }).catch(resp => {\n console.log(`Error loading language [${url}] ${resp.statusText} [${resp.status}]`)\n })\n }\n mergeData(this, LANGUAGES[code]);\n }\n }\n\n /**\n * Reimplement Util.mergeData to handle nested dictionaries\n * @param {object} lang_json \n */\n mergeData(lang_json) {\n for (k in LANGUAGES.en) {\n if (lang_json[k]) {\n if (typeof(this[k]) == 'object') {\n mergeData(lang_json[k], this[k]);\n } else {\n this[k] = lang_json[k]; // strings, mostly\n }\n }\n }\n }\n\n formatBigYear(bigyear, format_name) {\n var the_year = bigyear.year;\n var format_list = this.bigdateformats[format_name] || this.bigdateformats['fallback'];\n\n if (format_list) {\n for (var i = 0; i < format_list.length; i++) {\n var tuple = format_list[i];\n if (Math.abs(the_year / tuple[0]) > 1) {\n // will we ever deal with distant future dates?\n return formatNumber(Math.abs(the_year / tuple[0]), tuple[1])\n }\n };\n\n return the_year.toString();\n\n } else {\n trace(\"Language file dateformats missing cosmological. Falling back.\");\n return formatNumber(the_year, format_name);\n }\n }\n\n _(k) {\n return this.messages[k] || Language.fallback.messages[k] || k;\n }\n\n formatDate(date, format_name) {\n\n if (date.constructor == Date) {\n return this.formatJSDate(date, format_name);\n }\n\n if (date.constructor == BigYear) {\n return this.formatBigYear(date, format_name);\n }\n\n if (date.data && date.data.date_obj) {\n return this.formatDate(date.data.date_obj, format_name);\n }\n\n trace(\"Unfamiliar date presented for formatting\");\n return date.toString();\n }\n\n\n\n formatJSDate(js_date, format_name) {\n // ultimately we probably want this to work with TLDate instead of (in addition to?) JS Date\n // utc, timezone and timezoneClip are carry over from Steven Levithan implementation. We probably aren't going to use them.\n var self = this;\n var formatPeriod = function(fmt, value) {\n var formats = self.period_labels[fmt];\n if (formats) {\n var fmt = (value < 12) ? formats[0] : formats[1];\n }\n return \"<span class='tl-timeaxis-timesuffix'>\" + fmt + \"</span>\";\n }\n\n var utc = false,\n timezone = /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,\n timezoneClip = /[^-+\\dA-Z]/g;\n\n\n if (!format_name) {\n format_name = 'full';\n }\n\n var mask = this.dateformats[format_name] || Language.fallback.dateformats[format_name];\n if (!mask) {\n mask = format_name; // allow custom format strings\n }\n\n\n var _ = utc ? \"getUTC\" : \"get\",\n d = js_date[_ + \"Date\"](),\n D = js_date[_ + \"Day\"](),\n m = js_date[_ + \"Month\"](),\n y = js_date[_ + \"FullYear\"](),\n H = js_date[_ + \"Hours\"](),\n M = js_date[_ + \"Minutes\"](),\n s = js_date[_ + \"Seconds\"](),\n L = js_date[_ + \"Milliseconds\"](),\n o = utc ? 0 : js_date.getTimezoneOffset(),\n year = \"\",\n flags = {\n d: d,\n dd: pad(d),\n ddd: this.date.day_abbr[D],\n dddd: this.date.day[D],\n m: m + 1,\n mm: pad(m + 1),\n mmm: this.date.month_abbr[m],\n mmmm: this.date.month[m],\n yy: String(y).slice(2),\n yyyy: (y < 0 && this.has_negative_year_modifier()) ? Math.abs(y) : y,\n h: H % 12 || 12,\n hh: pad(H % 12 || 12),\n H: H,\n HH: pad(H),\n M: M,\n MM: pad(M),\n s: s,\n ss: pad(s),\n l: pad(L, 3),\n L: pad(L > 99 ? Math.round(L / 10) : L),\n t: formatPeriod('t', H),\n tt: formatPeriod('tt', H),\n T: formatPeriod('T', H),\n TT: formatPeriod('TT', H),\n Z: utc ? \"UTC\" : (String(js_date).match(timezone) || [\"\"]).pop().replace(timezoneClip, \"\"),\n o: (o > 0 ? \"-\" : \"+\") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),\n S: [\"th\", \"st\", \"nd\", \"rd\"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]\n };\n\n var formatted = mask.replace(Language.DATE_FORMAT_TOKENS, function($0) {\n return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);\n });\n\n return this._applyEra(formatted, y);\n }\n\n has_negative_year_modifier() {\n return Boolean(this.era_labels.negative_year.prefix || this.era_labels.negative_year.suffix);\n }\n\n\n _applyEra(formatted_date, original_year) {\n // trusts that the formatted_date was property created with a non-negative year if there are\n // negative affixes to be applied\n var labels = (original_year < 0) ? this.era_labels.negative_year : this.era_labels.positive_year;\n var result = '';\n if (labels.prefix) { result += '<span>' + labels.prefix + '</span> ' }\n result += formatted_date;\n if (labels.suffix) { result += ' <span>' + labels.suffix + '</span>' }\n return result;\n }\n\n\n}\n\n/**\n * Provide an async factory method for loading languages that clarifies the need to wait \n * for the language data to be loaded, so that other code doesn't press ahead before the language\n * is available. \n * \n * \n * @param {String} language_code - a language code or a fully-qualified URL to a language JSON file\n * @param {String} script_path - a URL prefix which can be used to construct a fully-qualified URL to a language file using `language_code`\n * \n * @returns {Language} - an instance of Language, or null if there's an error loading the translation file\n */\nasync function loadLanguage(language_code, script_path) {\n var url = buildLanguageURL(language_code, script_path);\n try {\n if (!LANGUAGES[language_code]) {\n let json = await fetchJSON(url)\n LANGUAGES[language_code] = json\n }\n return new Language(language_code, script_path)\n } catch (e) {\n console.log(`Error loading language [${url}] ${e.statusText}`)\n return null;\n }\n\n}\n\nfunction buildLanguageURL(code, script_path) {\n if (/\\.json$/.test(code)) {\n var url = code;\n } else {\n var fragment = \"/locale/\" + code + \".json\";\n if (/\\/$/.test(script_path)) { fragment = fragment.substr(1); }\n var url = script_path + fragment;\n }\n return url;\n}\n\nfunction formatNumber(val, mask) {\n if (mask.match(/%(\\.(\\d+))?f/)) {\n var match = mask.match(/%(\\.(\\d+))?f/);\n var token = match[0];\n if (match[2]) {\n val = val.toFixed(match[2]);\n }\n return mask.replace(token, val);\n }\n // use mask as literal display value.\n return mask;\n}\n\n\n\n\nLanguage.fallback = { messages: {} }; // placeholder to satisfy IE8 early compilation\n\n\nLanguage.DATE_FORMAT_TOKENS = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\\1?|[LloSZ]|\"[^\"]*\"|'[^']*'/g;\n\nvar LANGUAGES = {\n /*\n\tThis represents the canonical list of message keys which translation files should handle. The existence of the 'en.json' file should not mislead you.\n\tIt is provided more as a starting point for someone who wants to provide a\n new translation since the form for non-default languages (JSON not JS) is slightly different \n from what appears below. Also, those files have some message keys grandfathered in from TimelineJS2 \n which we'd rather not have to get \"re-translated\" if we use them.\n*/\n en: {\n name: \"English (built-in)\",\n lang: \"en\",\n api: {\n wikipedia: \"en\" // the two letter code at the beginning of the Wikipedia subdomain for this language\n },\n messages: {\n loading: \"Loading\",\n wikipedia: \"From Wikipedia, the free encyclopedia\",\n error: \"Error\",\n contract_timeline: \"Contract Timeline\",\n return_to_title: \"Return to Title\",\n loading_content: \"Loading Content\",\n expand_timeline: \"Expand Timeline\",\n loading_timeline: \"Loading Timeline... \",\n swipe_to_navigate: \"Swipe to Navigate<br><span class='tl-button'>OK</span>\",\n unknown_read_err: \"An unexpected error occurred trying to read your spreadsheet data\",\n invalid_url_err: \"Unable to read Timeline data. Make sure your URL is for a Google Spreadsheet or a Timeline JSON file.\",\n invalid_url_share_required: \"Because of unexpected changes to Google's data access API, the creator of this timeline must enable 'anyone with the url can read' access for this spreadsheet. See timeline.knightlab.com for more information.\",\n network_err: \"Unable to read your Google Spreadsheet. Make sure you have published it to the web.\",\n empty_feed_err: \"No data entries found\",\n missing_start_date_err: \"Missing start_date\",\n invalid_data_format_err: \"Header row has been modified.\",\n invalid_start_time_without_date: \"Invalid configuration: time cannot be used without date.\",\n invalid_end_time_without_date: \"Invalid configuration: end time cannot be used without end date.\",\n date_compare_err: \"Can't compare timeline date objects on different scales\",\n invalid_scale_err: \"Invalid scale\",\n invalid_date_err: \"Invalid date: month, day and year must be numbers.\",\n invalid_separator_error: \"Invalid time: misuse of : or . as separator.\",\n invalid_hour_err: \"Invalid time (hour)\",\n invalid_minute_err: \"Invalid time (minute)\",\n invalid_second_err: \"Invalid time (second)\",\n invalid_fractional_err: \"Invalid time (fractional seconds)\",\n invalid_second_fractional_err: \"Invalid time (seconds and fractional seconds)\",\n invalid_year_err: \"Invalid year\",\n flickr_notfound_err: \"Photo not found or private\",\n flickr_invalidurl_err: \"Invalid Flickr URL\",\n imgur_invalidurl_err: \"Invalid Imgur URL\",\n twitter_invalidurl_err: \"Invalid Twitter URL\",\n twitter_load_err: \"Unable to load Tweet\",\n twitterembed_invalidurl_err: \"Invalid Twitter Embed url\",\n wikipedia_load_err: \"Unable to load Wikipedia entry\",\n youtube_invalidurl_err: \"Invalid YouTube URL\",\n spotify_invalid_url: \"Invalid Spotify URL\",\n template_value_err: \"No value provided for variable\",\n invalid_rgb_err: \"Invalid RGB argument\",\n time_scale_scale_err: \"Don't know how to get date from time for scale\",\n axis_helper_no_options_err: \"Axis helper must be configured with options\",\n axis_helper_scale_err: \"No AxisHelper available for scale\",\n invalid_integer_option: \"Invalid option value—must be a whole number.\",\n instagram_bad_request: \"Invalid or private Instagram URL\"\n },\n date: {\n month: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n month_abbr: [\n \"Jan.\",\n \"Feb.\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"Aug.\",\n \"Sept.\",\n \"Oct.\",\n \"Nov.\",\n \"Dec.\"\n ],\n day: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n ],\n day_abbr: [\n \"Sun.\",\n \"Mon.\",\n \"Tues.\",\n \"Wed.\",\n \"Thurs.\",\n \"Fri.\",\n \"Sat.\"\n ]\n },\n era_labels: {\n // specify prefix or suffix to apply to formatted date. Blanks mean no change.\n positive_year: {\n prefix: \"\",\n suffix: \"\"\n },\n negative_year: {\n // if either of these is specified, the year will be converted to positive before they are applied\n prefix: \"\",\n suffix: \"BCE\"\n }\n },\n period_labels: {\n // use of t/tt/T/TT legacy of original Timeline date format\n t: [\"a\", \"p\"],\n tt: [\"am\", \"pm\"],\n T: [\"A\", \"P\"],\n TT: [\"AM\", \"PM\"]\n },\n dateformats: {\n year: \"yyyy\",\n month_short: \"mmm\",\n month: \"mmmm yyyy\",\n full_short: \"mmm d\",\n full: \"mmmm d',' yyyy\",\n time: \"h:MM:ss TT' <small>'mmmm d',' yyyy'</small>'\",\n time_short: \"h:MM:ss TT\",\n time_no_seconds_short: \"h:MM TT\",\n time_no_minutes_short: \"h TT\",\n time_no_seconds_small_date: \"h:MM TT' <small>'mmmm d',' yyyy'</small>'\",\n time_milliseconds: \"l\",\n full_long: \"mmm d',' yyyy 'at' h:MM TT\",\n full_long_small_date: \"h:MM TT' <small>mmm d',' yyyy'</small>'\"\n },\n bigdateformats: {\n fallback: [\n // a list of tuples, with t[0] an order of magnitude and t[1] a format string. format string syntax may change...\n [1000000000, \"%.2f billion years ago\"],\n [1000000, \"%.1f million years ago\"],\n [1000, \"%.1f thousand years ago\"],\n [1, \"%f years ago\"]\n ],\n compact: [\n [1000000000, \"%.2f bya\"],\n [1000000, \"%.1f mya\"],\n [1000, \"%.1f kya\"],\n [1, \"%f years ago\"]\n ],\n verbose: [\n [1000000000, \"%.2f billion years ago\"],\n [1000000, \"%.1f million years ago\"],\n [1000, \"%.1f thousand years ago\"],\n [1, \"%f years ago\"]\n ]\n }\n }\n};\n\nlet fallback = new Language();\nLanguage.fallback = fallback;\nexport { Language, fallback, loadLanguage }","/* I18NMixins\n assumes that its class has an options object with a Language instance \n================================================== */\nimport { trace } from \"../core/Util\"\nimport { fallback } from \"../language/Language\"\nclass I18NMixins {\n setLanguage(language) {\n this.language = language;\n }\n\n getLanguage() {\n if (this.language) {\n if (typeof this.language == 'object') {\n return this.language;\n } else {\n trace(\n `I18NMixins.getLanguage: this.language should be object, but is ${typeof this\n .language}`\n );\n }\n }\n\n // trace(\"I18NMixins.getLanguage: Expected a language option\");\n return fallback;\n }\n\n _(msg) {\n return this.getLanguage()._(msg);\n }\n}\n\nexport { I18NMixins }","/*\tMessage\n\t\n================================================== */\nimport { TLClass } from \"../core/TLClass\"\nimport { mergeData, classMixin } from \"../core/Util\"\nimport * as DOM from \"../dom/DOM\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport { I18NMixins } from \"../language/I18NMixins\"\n\n/**\n * A class for displaying messages to users.\n */\nexport default class Message{\n\n /**\n * Initialize a Message object with the container where it appears and, \n * optionally, a JS object of options.\n * @param {HTMLElement} container \n * @param {object} [options] \n */\n constructor(container, options, language) {\n\n if (language) {\n this.setLanguage(language)\n }\n // DOM ELEMENTS\n this._el = {\n parent: {},\n container: {},\n message_container: {},\n loading_icon: {},\n message: {}\n };\n\n //Options\n this.options = {\n width: 600,\n height: 600,\n message_class: \"tl-message\",\n message_icon_class: \"tl-loading-icon\"\n };\n\n this.container = container\n\n mergeData(this.options, options);\n\n this._el.container = DOM.create(\n \"div\",\n this.options.message_class\n );\n\n if (container) {\n container.appendChild(this._el.container);\n this._el.parent = container;\n }\n\n // Animation\n this.animator = {};\n\n this._initLayout();\n this._initEvents();\n }\n\n updateMessage(t) {\n if (!t) {\n this._el.message.innerHTML = this._(\"loading\");\n } else {\n this._el.message.innerHTML = t;\n }\n\n // Re-add to DOM?\n if (\n !this._el.parent.atributes &&\n this.container.attributes\n ) {\n this.container.appendChild(this._el.container);\n this._el.parent = this.container;\n }\n }\n\n /*\tUpdate Display\n================================================== */\n updateDisplay(w, h) {\n // no-op but probably should be implemented\n }\n\n _onMouseClick() {\n this.fire(\"clicked\", this.options);\n }\n\n _onRemove() {\n this._el.parent = {};\n }\n\n _initLayout() {\n // Create Layout\n this._el.message_container = DOM.create(\n \"div\",\n \"tl-message-container\",\n this._el.container\n );\n this._el.loading_icon = DOM.create(\n \"div\",\n this.options.message_icon_class,\n this._el.message_container\n );\n this._el.message = DOM.create(\n \"div\",\n \"tl-message-content\",\n this._el.message_container\n );\n\n this.updateMessage();\n }\n\n _initEvents() {\n DOMEvent.addListener(this._el.container, 'click', this._onMouseClick, this);\n DOMEvent.addListener(this, 'removed', this._onRemove, this);\n }\n\n}\nclassMixin(Message, I18NMixins, Events, DOMMixins); \n","import TLError from \"../core/TLError\"\n\nimport { TLDate, BigDate } from \"../date/TLDate\"\nimport { trim } from \"../core/Util\"\n\nexport function sortByDate(array, prop_name) { // only for use with slide data objects\n var prop_name = prop_name || 'start_date';\n array.sort(function(a, b) {\n if (a[prop_name].isBefore(b[prop_name])) return -1;\n if (a[prop_name].isAfter(b[prop_name])) return 1;\n return 0;\n });\n}\n\nexport function parseTime(time_str) {\n var parsed = {\n hour: null,\n minute: null,\n second: null,\n millisecond: null // conform to keys in TLDate\n }\n var period = null;\n var match = time_str.match(/(\\s*[AaPp]\\.?[Mm]\\.?\\s*)$/);\n if (match) {\n period = trim(match[0]);\n time_str = trim(time_str.substring(0, time_str.lastIndexOf(period)));\n }\n\n var parts = [];\n var no_separators = time_str.match(/^\\s*(\\d{1,2})(\\d{2})\\s*$/);\n if (no_separators) {\n parts = no_separators.slice(1);\n } else {\n parts = time_str.split(':');\n if (parts.length == 1) {\n parts = time_str.split('.');\n }\n }\n\n if (parts.length > 4) {\n throw new TLError(\"invalid_separator_error\");\n }\n let hour_part = parts[0]\n parsed.hour = parseInt(hour_part);\n\n if (period && period.toLowerCase()[0] == 'p' && parsed.hour != 12) {\n parsed.hour += 12;\n } else if (period && period.toLowerCase()[0] == 'a' && parsed.hour == 12) {\n parsed.hour = 0;\n }\n\n\n if (isNaN(parsed.hour) || parsed.hour < 0 || parsed.hour > 23) {\n throw new TLError(\"invalid_hour_err\", hour_part);\n }\n\n if (parts.length > 1) {\n let minute_part = parts[1]\n parsed.minute = parseInt(minute_part);\n if (isNaN(parsed.minute)) {\n throw new TLError(\"invalid_minute_err\", minute_part);\n }\n }\n\n if (parts.length > 2) {\n var sec_parts = parts[2].split(/[\\.,]/);\n parts = sec_parts.concat(parts.slice(3)) // deal with various methods of specifying fractional seconds\n if (parts.length > 2) {\n throw new TLError(\"invalid_second_fractional_err\");\n }\n parsed.second = parseInt(parts[0]);\n if (isNaN(parsed.second)) {\n throw new TLError(\"invalid_second_err\", parts[0]);\n }\n if (parts.length == 2) {\n var frac_secs = parseInt(parts[1]);\n if (isNaN(frac_secs)) {\n throw new TLError(\"invalid_fractional_err\", parts[1]);\n }\n parsed.millisecond = 100 * frac_secs;\n }\n }\n\n return parsed;\n}\n\nconst VALID_INTEGER_PATTERN = new RegExp('(^-?\\\\d+$|^$)')\n\nexport function validDateConfig(d) {\n\n try {\n Object.keys(d).forEach(k => {\n let v = d[k]\n if (v && v.match) {\n if (!v.match(VALID_INTEGER_PATTERN)) {\n throw `invalid value ${v} for ${k}`\n }\n }\n })\n return true;\n } catch (error) {\n return false;\n }\n}\n\n\nexport const SCALE_DATE_CLASSES = {\n human: TLDate,\n cosmological: BigDate\n}","import { sortByDate, SCALE_DATE_CLASSES } from \"../date/DateUtil\"\nimport { BigDate } from \"../date/TLDate\"\nimport { trim, ensureUniqueKey, slugify, unique_ID, trace, stripMarkup } from \"../core/Util\"\nimport TLError from \"../core/TLError\"\nimport DOMPurify from 'dompurify';\n\nconst SANITIZE_FIELDS = {\n text: ['headline', 'text'],\n media: ['caption', 'credit'] // media \"URL\" must be sanitized in Media classes to avoid messing up URLs\n}\n\nconst STRIP_MARKUP_FIELDS = {\n start_date: ['display_date'],\n end_date: ['display_date'],\n slide: ['display_date', 'group'],\n date: ['display_date']\n\n}\n\n/**\n * After sanitizing, make sure all <a> tags with 'href' attributes that \n * don't have a target attribute are set to open in a new ('_blank') \n * window. Also make sure that all <a> tags which are set to open in a '_blank'\n * window set `rel=\"noopener\"`\n */\nDOMPurify.addHook('afterSanitizeAttributes', function(node) {\n\n if (node.nodeName == 'A' && 'href' in node) {\n if (!('target' in node.attributes)) {\n node.setAttribute('target', '_blank');\n }\n let rel = node.attributes['rel']\n if (!rel) {\n node.setAttribute('rel', 'noopener');\n } else {\n if (rel.value.indexOf('noopener') == -1) {\n node.setAttribute('rel', `noopener ${rel.value}`)\n }\n }\n }\n});\n\nfunction _process_fields(slide, callback, fieldmap) {\n Object.keys(fieldmap).forEach(k => {\n var to_sanitize = (k == 'slide') ? slide : slide[k]\n if (to_sanitize) {\n fieldmap[k].forEach(i => {\n if (typeof(to_sanitize[i]) != 'undefined') {\n to_sanitize[i] = callback(to_sanitize[i])\n }\n })\n }\n })\n\n}\n\n/**\n * Centralize use of HTML sanitizer so that we can enforce common\n * rules. Maybe we would want to push this to Util and unit test\n * but ultimately we're trusting the creators of the library.\n * @param {string} txt \n */\nfunction _tl_sanitize(txt) {\n return DOMPurify.sanitize(txt, {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['frameborder', 'target'],\n })\n}\n\nexport class TimelineConfig {\n constructor(data) {\n this.title = '';\n this.scale = '';\n this.events = [];\n this.eras = [];\n this.event_dict = {}; // despite name, all slides (events + title) indexed by slide.unique_id\n this.messages = {\n errors: [],\n warnings: []\n };\n\n // Initialize the data\n if (typeof data === 'object' && data.events) {\n this.scale = data.scale;\n this.events = [];\n this._ensureValidScale(data.events);\n\n if (data.title) {\n // the 'title' is a kind of slide, one without a date\n var title_id = this._assignID(data.title);\n this._tidyFields(data.title);\n this.title = data.title;\n this.event_dict[title_id] = this.title;\n }\n\n for (var i = 0; i < data.events.length; i++) {\n try {\n this.addEvent(data.events[i], true);\n } catch (e) {\n this.logError(e);\n }\n }\n\n if (data.eras) {\n data.eras.forEach((era_data, indexOf) => {\n try {\n this.addEra(era_data)\n } catch (e) {\n this.logError(\"Era \" + indexOf + \": \" + e);\n }\n })\n }\n\n sortByDate(this.events);\n sortByDate(this.eras);\n\n }\n }\n\n logError(msg) {\n trace(`logError: ${msg}`);\n this.messages.errors.push(msg);\n }\n\n /*\n * Return any accumulated error messages. If `sep` is passed, it should be a string which will be used to join all messages, resulting in a string return value. Otherwise,\n * errors will be returned as an array.\n */\n getErrors(sep) {\n if (sep) {\n return this.messages.errors.join(sep);\n } else {\n return this.messages.errors;\n }\n }\n\n\n /*\n * Perform any sanity checks we can before trying to use this to make a timeline. Returns nothing, but errors will be logged\n * such that after this is called, one can test `this.isValid()` to see if everything is OK.\n */\n validate() {\n if (typeof(this.events) == \"undefined\" || typeof(this.events.length) == \"undefined\" || this.events.length == 0) {\n this.logError(\"Timeline configuration has no events.\")\n }\n\n // make sure all eras have start and end dates\n for (var i = 0; i < this.eras.length; i++) {\n if (typeof(this.eras[i].start_date) == 'undefined' || typeof(this.eras[i].end_date) == 'undefined') {\n var era_identifier;\n if (this.eras[i].headline) {\n era_identifier = this.eras[i].headline\n } else {\n era_identifier = \"era \" + (i + 1);\n }\n this.logError(\"All eras must have start and end dates. [\" + era_identifier + \"]\") // add internationalization (I18N) and context\n }\n };\n }\n\n\n /**\n * @returns {boolean} whether or not this config has logged errors. \n */\n isValid() {\n return this.messages.errors.length == 0;\n }\n\n /* Add an event (including cleaning/validation) and return the unique id.\n * All event data validation should happen in here.\n * Throws: TLError for any validation problems.\n */\n addEvent(data, defer_sort) {\n var event_id = this._assignID(data);\n\n if (typeof(data.start_date) == 'undefined') {\n trace(\"Missing start date, skipping event\")\n console.log(data)\n return null\n // throw new TLError(\"missing_start_date_err\", event_id);\n }\n\n this._processDates(data);\n this._tidyFields(data);\n\n this.events.push(data);\n this.event_dict[event_id] = data;\n\n if (!defer_sort) {\n sortByDate(this.events);\n }\n return event_id;\n }\n\n addEra(data) {\n var event_id = this._assignID(data);\n\n if (typeof(data.start_date) == 'undefined') {\n throw new TLError(\"missing_start_date_err\", event_id);\n }\n\n this._processDates(data);\n this._tidyFields(data);\n\n this.eras.push({\n start_date: data.start_date,\n end_date: data.end_date,\n headline: data.text.headline\n });\n }\n\n /**\n * Given a slide, verify that its ID is unique, or assign it one which is.\n * The assignment happens in this function, and the assigned ID is also\n * the return value. Not thread-safe, because ids are not reserved\n * when assigned here.\n */\n _assignID(slide) {\n var slide_id = slide.unique_id;\n if (!trim(slide_id)) {\n // give it an ID if it doesn't have one\n slide_id = (slide.text) ? slugify(slide.text.headline) : null;\n }\n // make sure it's unique and add it.\n slide.unique_id = ensureUniqueKey(this.event_dict, slide_id);\n return slide.unique_id\n }\n\n /**\n * Given an array of slide configs (the events), ensure that each one has a distinct unique_id. The id of the title\n * is also passed in because in most ways it functions as an event slide, and the event IDs must also all be unique\n * from the title ID.\n */\n _makeUniqueIdentifiers(title_id, array) {\n var used = [title_id];\n\n // establish which IDs are assigned and if any appear twice, clear out successors.\n for (var i = 0; i < array.length; i++) {\n if (trim(array[i].unique_id)) {\n array[i].unique_id = slugify(array[i].unique_id); // enforce valid\n if (used.indexOf(array[i].unique_id) == -1) {\n used.push(array[i].unique_id);\n } else { // it was already used, wipe it out\n array[i].unique_id = '';\n }\n }\n };\n\n if (used.length != (array.length + 1)) {\n // at least some are yet to be assigned\n for (var i = 0; i < array.length; i++) {\n if (!array[i].unique_id) {\n // use the headline for the unique ID if it's available\n var slug = (array[i].text) ? slugify(array[i].text.headline) : null;\n if (!slug) {\n slug = unique_ID(6); // or generate a random ID\n }\n if (used.indexOf(slug) != -1) {\n slug = slug + '-' + i; // use the index to get a unique ID.\n }\n used.push(slug);\n array[i].unique_id = slug;\n }\n }\n }\n }\n\n _ensureValidScale(events) {\n if (!this.scale) {\n this.scale = \"human\"; // default to human unless there's a slide which is explicitly 'cosmological' or one which has a cosmological year\n\n for (var i = 0; i < events.length; i++) {\n if (events[i].scale == 'cosmological') {\n this.scale = 'cosmological';\n break;\n }\n if (events[i].start_date && typeof(events[i].start_date.year) != \"undefined\") {\n var d = new BigDate(events[i].start_date);\n var year = d.data.date_obj.year;\n if (year < -271820 || year > 275759) {\n this.scale = \"cosmological\";\n break;\n }\n }\n }\n trace(`Determining scale dynamically: ${this.scale}`);\n }\n var dateCls = SCALE_DATE_CLASSES[this.scale];\n if (!dateCls) { this.logError(\"Don't know how to process dates on scale \" + this.scale); }\n }\n /*\n Given a thing which has a start_date and optionally an end_date, make sure that it is an instance\n of the correct date class (for human or cosmological scale). For slides, remove redundant end dates\n (people frequently configure an end date which is the same as the start date).\n */\n _processDates(slide_or_era) {\n var dateCls = SCALE_DATE_CLASSES[this.scale];\n if (!(slide_or_era.start_date instanceof dateCls)) {\n var start_date = slide_or_era.start_date;\n slide_or_era.start_date = new dateCls(start_date);\n\n // eliminate redundant end dates.\n if (typeof(slide_or_era.end_date) != 'undefined' && !(slide_or_era.end_date instanceof dateCls)) {\n var end_date = slide_or_era.end_date;\n var equal = true;\n for (let property in start_date) {\n equal = equal && (start_date[property] == end_date[property]);\n }\n if (equal) {\n trace(\"End date same as start date is redundant; dropping end date\");\n delete slide_or_era.end_date;\n } else {\n slide_or_era.end_date = new dateCls(end_date);\n }\n\n }\n }\n\n }\n /**\n * Return the earliest date that this config knows about, whether it's a slide or an era\n */\n getEarliestDate() {\n // counting that dates were sorted in initialization\n var date = this.events[0].start_date;\n if (this.eras && this.eras.length > 0) {\n if (this.eras[0].start_date.isBefore(date)) {\n return this.eras[0].start_date;\n }\n }\n return date;\n\n }\n /**\n * Return the latest date that this config knows about, whether it's a slide or an era, taking end_dates into account.\n */\n getLatestDate() {\n var dates = [];\n for (var i = 0; i < this.events.length; i++) {\n if (this.events[i].end_date) {\n dates.push({ date: this.events[i].end_date });\n } else {\n dates.push({ date: this.events[i].start_date });\n }\n }\n for (var i = 0; i < this.eras.length; i++) {\n if (this.eras[i].end_date) {\n dates.push({ date: this.eras[i].end_date });\n } else {\n dates.push({ date: this.eras[i].start_date });\n }\n }\n sortByDate(dates, 'date');\n return dates.slice(-1)[0].date;\n }\n\n /**\n * Do some simple cleanup for all slides and eras, including sanitizing \n * HTML input, or stripping markup for fields which are not intended to support\n * it.\n * @param { Slide | TimeEra } slide \n */\n _tidyFields(slide) {\n\n function fillIn(obj, key, default_value) {\n if (!default_value) default_value = '';\n if (!obj.hasOwnProperty(key)) { obj[key] = default_value }\n }\n\n if (slide.group) {\n slide.group = trim(slide.group);\n }\n\n if (!slide.text) {\n slide.text = {};\n }\n fillIn(slide.text, 'text');\n fillIn(slide.text, 'headline');\n\n _process_fields(slide, _tl_sanitize, SANITIZE_FIELDS)\n // handle media.url separately\n _process_fields(slide, stripMarkup, STRIP_MARKUP_FIELDS)\n\n }\n}","/* Adapted from okfn/csv.js under MIT license\nhttps://github.com/okfn/csv.js/blob/master/LICENSE.txt\nCopyright (c) 2011-2013 Open Knowledge Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nfunction chomp(s, lineterminator) {\n\n if (s == null) return ''\n\n lineterminator = lineterminator || '\\n'\n\n if (s.charAt(s.length - lineterminator.length) !== lineterminator) {\n // Does not end with \\n, just return string\n return s;\n } else {\n // Remove the \\n\n return s.substring(0, s.length - lineterminator.length);\n }\n}\n\n/**\n * Fetch data from a URL and parse the response as a CSV file.\n * To specify the data source, use `dataset.url`. \n * @param {Object} dataset \n * @returns {Promise} which invokes resolve with an array of objects of length \n * [csv row count - 1], where the \n * property names are determined by the first row.\n */\nexport async function fetchCSV(dataset) {\n return new Promise((resolve, reject) => {\n if (dataset.data) {\n var out = extractFields(parse(dataset.data, dataset), dataset);\n out.useMemoryStore = true;\n resolve(out);\n } else if (dataset.url) {\n window.fetch(dataset.url, { mode: 'cors' })\n .then(function(response) {\n if (response.status != 200) {\n if (response.headers.get('content-type') == \"application/json\") {\n response.text().then(text => {\n reject(JSON.parse(text))\n })\n } else {\n reject({\n status_code: response.status,\n message: `Error fetching CSV: [${response.status} ${response.statusText}]`\n })\n }\n return;\n }\n if (response.text) {\n return response.text();\n } else {\n return response;\n }\n })\n .then(function(data) {\n if (data) {\n var out = parseObjects(data, dataset);\n out.useMemoryStore = true;\n resolve(out);\n }\n })\n .catch(msg => {\n reject({\n status_code: 500,\n message: `Error fetching CSV: ${msg}`\n })\n return;\n });\n }\n })\n};\n\n/**\n * Given an array of rows, split them into an object with two keys:\n * `fields` and `records`. `fields` is the first item of the array\n * and `records` is the remainder. If `noFields.noHeaderRow` is true, \n * the returned object will not have a `fields` property and its `records`\n * property will be the entire array of input `rows`.\n * @param {Array} rows \n * @param {Object} [noFields]\n */\nexport function extractFields(rows, noFields) {\n noFields = noFields || {}\n if (noFields.noHeaderRow !== true && rows.length > 0) {\n return {\n fields: rows[0].map((x, i) => {\n if (x && x.trim) {\n return x.trim()\n }\n return `untitled${i}`\n }),\n records: rows.slice(1)\n };\n } else {\n return {\n records: rows\n };\n }\n};\n\nfunction normalizeDialectOptions(options) {\n // note lower case compared to CSV DDF\n var out = {\n delimiter: \",\",\n doublequote: true,\n lineterminator: \"\\n\",\n quotechar: '\"',\n skipinitialspace: true,\n skipinitialrows: 0\n };\n for (var key in options) {\n if (key === \"trim\") {\n out[\"skipinitialspace\"] = options.trim;\n } else {\n out[key.toLowerCase()] = options[key];\n }\n }\n return out;\n};\n\n// ## parse\n//\n// For docs see the README\n//\n// Heavily based on uselesscode's JS CSV parser (MIT Licensed):\n// http://www.uselesscode.org/javascript/csv/\nexport function parse(s, dialect) {\n // When line terminator is not provided then we try to guess it\n // and normalize it across the file.\n if (!dialect || (dialect && !dialect.lineterminator)) {\n s = normalizeLineTerminator(s, dialect);\n }\n\n // Get rid of any trailing \\n\n var options = normalizeDialectOptions(dialect);\n s = chomp(s, options.lineterminator);\n\n var cur = \"\", // The character we are currently processing.\n inQuote = false,\n fieldQuoted = false,\n field = \"\", // Buffer for building up the current field\n row = [],\n out = [],\n i,\n processField;\n\n processField = function(field) {\n if (fieldQuoted !== true) {\n // If field is empty set to null\n if (field === \"\") {\n field = null;\n // If the field was not quoted and we are trimming fields, trim it\n } else if (options.skipinitialspace === true) {\n field = field.trim();\n }\n\n // Convert unquoted numbers to their appropriate types\n // but Timeline never expects real numbers, so we'll leave that out here.\n // if (rxIsInt.test(field)) {\n // field = parseInt(field, 10);\n // } else if (rxIsFloat.test(field)) {\n // field = parseFloat(field, 10);\n // }\n }\n return field;\n };\n\n for (i = 0; i < s.length; i += 1) {\n cur = s.charAt(i);\n\n // If we are at a EOF or EOR\n if (\n inQuote === false &&\n (cur === options.delimiter || cur === options.lineterminator)\n ) {\n field = processField(field);\n // Add the current field to the current row\n row.push(field);\n // If this is EOR append row to output and flush row\n if (cur === options.lineterminator) {\n out.push(row);\n row = [];\n }\n // Flush the field buffer\n field = \"\";\n fieldQuoted = false;\n } else {\n // If it's not a quotechar, add it to the field buffer\n if (cur !== options.quotechar) {\n field += cur;\n } else {\n if (!inQuote) {\n // We are not in a quote, start a quote\n inQuote = true;\n fieldQuoted = true;\n } else {\n // Next char is quotechar, this is an escaped quotechar\n if (s.charAt(i + 1) === options.quotechar) {\n field += options.quotechar;\n // Skip the next char\n i += 1;\n } else {\n // It's not escaping, so end quote\n inQuote = false;\n }\n }\n }\n }\n }\n\n // Add the last field\n field = processField(field);\n row.push(field);\n out.push(row);\n\n // Expose the ability to discard initial rows\n if (options.skipinitialrows) out = out.slice(options.skipinitialrows);\n\n return out;\n}\n\n/**\n * If no lineterminator is specified in `dialect`, convert CRLF and CR \n * to LF (newline) to simplify splitting lines.\n * @param {String} csvString - a String representation of a CSV file\n * @param {Object} [dialect] - details about the CSV dialect to guide the parser\n */\nfunction normalizeLineTerminator(csvString, dialect) {\n if (dialect && !dialect.lineterminator) {\n return csvString.replace(/(\\r\\n|\\n|\\r)/gm, \"\\n\");\n }\n // if not return the string untouched.\n return csvString;\n}\n\n/**\n * Given a CSV String, parse it and return it as an array of objects, one-per-row \n * after the header row. The header is the source of object properties. Will fail \n * unceremoniously if dialect.noHeaderRow is true\n * @param {String} s - a String representation of a CSV file\n * @param {Object} [dialect] - details about the CSV dialect to guide the parser\n */\nexport function parseObjects(s, dialect) {\n let rows = extractFields(parse(s, dialect))\n let objects = []\n rows.records.forEach(record => {\n let obj = {}\n rows.fields.forEach((f, i) => obj[f] = record[i])\n objects.push(obj)\n })\n return objects\n}","import { TimelineConfig } from \"../core/TimelineConfig\"\nimport { trim, isEmptyObject, mergeData, trace } from \"../core/Util\";\nimport { parseDate } from \"../date/TLDate\"\nimport TLError from \"../core/TLError\"\nimport { ajax } from \"../net/Net\"\nimport { parseTime, validDateConfig } from \"../date/DateUtil\"\nimport { fetchCSV } from '../core/CSV';\n\nfunction clean_integer(s) {\n if (s) {\n return s.replace(/[\\s,]+/g, ''); // doesn't handle '.' as comma separator, but how to distinguish that from decimal separator?\n }\n}\n\nexport function parseGoogleSpreadsheetURL(url) {\n let parts = {\n key: null,\n worksheet: 0 // not really sure how to use this to get the feed for that sheet, so this is not ready except for first sheet right now\n }\n // key as url parameter (old-fashioned)\n var key_pat = /\\bkey=([-_A-Za-z0-9]+)&?/i;\n var url_pat = /docs.google.com\\/spreadsheets(.*?)\\/d\\//; // fixing issue of URLs with u/0/d\n\n if (url.match(key_pat)) {\n parts.key = url.match(key_pat)[1];\n // can we get a worksheet from this form?\n } else if (url.match(url_pat)) {\n var pos = url.search(url_pat) + url.match(url_pat)[0].length;\n var tail = url.substr(pos);\n parts.key = tail.split('/')[0]\n if (url.match(/\\?gid=(\\d+)/)) {\n parts.worksheet = url.match(/\\?gid=(\\d+)/)[1];\n }\n } else if (url.match(/^\\b[-_A-Za-z0-9]+$/)) {\n parts.key = url;\n }\n\n if (parts.key) {\n return parts;\n } else {\n return null;\n }\n}\n\n\nfunction interpretBackground(bkgd) {\n if (typeof(bkgd) != 'string') return ''\n if (bkgd.match(/^(https?:)?\\/\\/?/)) { // support http, https, protocol relative, site relative\n return { 'url': bkgd }\n } else { // for now we'll trust it's a color\n return { 'color': bkgd }\n }\n\n}\n\nfunction extractEventFromCSVObject(orig_row) {\n\n let row = {}\n Object.keys(orig_row).forEach(k => {\n row[k] = trim(orig_row[k]) // get rid of white-space and reduce all-blank cells to empty strings\n })\n\n var d = {\n media: {\n caption: row['Media Caption'] || '',\n credit: row['Media Credit'] || '',\n url: row['Media'] || '',\n thumbnail: row['Media Thumbnail'] || ''\n },\n text: {\n headline: row['Headline'] || '',\n text: row['Text'] || ''\n },\n display_date: row['Display Date'] || '', // only in v3 but no problem\n group: row['Group'] || row['Tag'] || '', // small diff between v1 and v3 sheets\n background: interpretBackground(row['Background']), // only in v3 but no problem\n type: row['Type'] || ''\n }\n\n if (Object.keys(row).includes('Start Date') || Object.keys(row).includes('End Date')) {\n // V1 date handling\n if (row['Start Date']) {\n d.start_date = parseDate(row['Start Date'])\n }\n if (row['End Date']) {\n d.end_date = parseDate(row['End Date'])\n }\n } else {\n // V3 date handling\n // every date must have at least a year to be valid.\n if (row['Year']) {\n d.start_date = {\n year: clean_integer(row['Year']),\n month: clean_integer(row['Month']) || '',\n day: clean_integer(row['Day']) || ''\n }\n }\n if (row['End Year']) {\n d.end_date = {\n year: clean_integer(row['End Year']) || '',\n month: clean_integer(row['End Month']) || '',\n day: clean_integer(row['End Day']) || ''\n }\n }\n\n if (row['Time']) {\n if (d.start_date) {\n mergeData(d.start_date, parseTime(row['Time']));\n } else {\n throw new TLError(\"invalid_start_time_without_date\")\n }\n }\n\n if (row['End Time']) {\n if (d.end_date) {\n mergeData(d.end_date, parseTime(row['End Time']));\n } else {\n throw new TLError(\"invalid_end_time_without_date\")\n }\n }\n\n if (d.start_date && !validDateConfig(d.start_date)) {\n throw new TLError(\"invalid_date_err\")\n }\n\n if (d.end_date && !validDateConfig(d.end_date)) {\n throw new TLError(\"invalid_date_err\")\n }\n\n\n }\n\n return d\n}\n\n/**\n * Given a Google Sheets URL (or mere document ID), read the data and return\n * a Timeline JSON file suitable for instantiating a timeline.\n * \n * @param {string} url \n */\nexport async function readGoogleAsCSV(url, sheets_proxy) {\n\n let rows = []\n\n url = makeGoogleCSVURL(url)\n let error = null;\n\n await fetchCSV({\n url: `${sheets_proxy}${url}`,\n }).then(d => {\n rows = d;\n }).catch(error_json => {\n if (error_json.proxy_err_code == 'response_not_csv') {\n throw new TLError('Timeline could not read the data for your timeline. Make sure you have published it to the web.')\n }\n throw new TLError(error_json.message)\n })\n\n let timeline_config = { 'events': [], 'errors': [], 'warnings': [], 'eras': [] }\n\n rows.forEach((row, i) => {\n try {\n if (!isEmptyObject(row)) {\n let event = extractEventFromCSVObject(row)\n handleRow(event, timeline_config)\n }\n } catch (e) {\n if (e.constructor == TLError) {\n timeline_config.errors.push(e);\n } else {\n if (e.message) {\n e = e.message;\n }\n let label = row['Headline'] || i\n timeline_config.errors.push(e + `[${label}]`);\n }\n }\n });\n\n return timeline_config\n}\n/**\n * Given a Google Sheets URL or a bare spreadsheet key, return a URL expected\n * to retrieve a CSV file, assuming the Sheets doc has been \"published to the web\".\n * No checking for the actual availability is done.\n * @param {string} url_or_key \n */\nexport function makeGoogleCSVURL(url_or_key) {\n url_or_key = url_or_key.trim()\n if (url_or_key.match(/^[a-zA-Z0-9-_]+$/)) {\n // key pattern from https://developers.google.com/sheets/api/guides/concepts#spreadsheet_id\n return `https://docs.google.com/spreadsheets/d/${url_or_key}/pub?output=csv`\n }\n\n if (url_or_key.startsWith('https://docs.google.com/spreadsheets/')) {\n if (url_or_key.match(/\\/pub\\?output=csv$/)) return url_or_key\n let parsed = new URL(url_or_key)\n let params = new URLSearchParams(parsed.search)\n params.set('output', 'csv')\n if (params.get('gid')) {\n params.set('single', 'true')\n }\n parsed.search = `?${params.toString()}`\n let base_path = parsed.pathname.substr(0, parsed.pathname.lastIndexOf('/'))\n parsed.pathname = `${base_path}/pub`\n return parsed.toString()\n }\n throw new TLError('invalid_url_err', url_or_key);\n}\n\nvar buildGoogleFeedURL = function(key, api_version) {\n if (api_version == 'v4') {\n return \"https://sheets.googleapis.com/v4/spreadsheets/\" + key + \"/values/A1:R1000?key=AIzaSyCInR0kjJJ2Co6aQAXjLBQ14CEHam3K0xg\";\n } else {\n return \"https://spreadsheets.google.com/feeds/list/\" + key + \"/1/public/values?alt=json\";\n }\n}\n\nasync function jsonFromGoogleURL(google_url, options) {\n\n if (!options['sheets_proxy']) {\n throw new TLError(\"Proxy option must be set to read data from Google\")\n }\n\n var timeline_json = await readGoogleAsCSV(google_url, options['sheets_proxy']);\n\n if (timeline_json) {\n return timeline_json;\n }\n}\n\n/**\n * Using the given URL, fetch or create a JS Object suitable for configuring a timeline. Use \n * that to create a TimelineConfig, and invoke the callback with that object as its argument. \n * If the second argument is an object instead of a callback function, it must have a \n * 'callback' property which will be invoked with the config.\n * Even in error cases, a minimal TimelineConfig object will be created and passed to the callback\n * so that error messages can be displayed in the host page.\n * \n * @param {String} url the URL or Google Spreadsheet key which can be used to get configuration information\n * @param {function|object} callback_or_options either a callback function or an object with a 'callback' property and other configuration properties\n */\nexport async function makeConfig(url, callback_or_options) {\n\n let callback = null,\n options = {};\n if (typeof(callback_or_options) == 'function') {\n callback = callback_or_options\n } else if (typeof(callback_or_options) == 'object') {\n options = callback_or_options\n callback = callback_or_options['callback']\n if (typeof(options['callback']) == 'function') callback = options['callback']\n }\n\n if (!callback) {\n throw new TLError(\"Second argument to makeConfig must be either a function or an object which includes a 'callback' property with a 'function' type value\")\n }\n\n var tc,\n json,\n key = parseGoogleSpreadsheetURL(url);\n\n if (key) {\n try {\n json = await jsonFromGoogleURL(url, options);\n } catch (e) {\n // even with an error, we make \n // a TimelineConfig because it's \n // the most straightforward way to display messages\n // in the DOM\n tc = new TimelineConfig();\n if (e.name == 'NetworkError') {\n tc.logError(new TLError(\"network_err\"));\n } else if (e.name == 'TLError') {\n tc.logError(e);\n } else {\n tc.logError(new TLError(\"unknown_read_err\", e.name));\n }\n callback(tc);\n return; // don't process further if there were errors\n }\n\n tc = new TimelineConfig(json);\n if (json.errors) {\n for (var i = 0; i < json.errors.length; i++) {\n tc.logError(json.errors[i]);\n };\n }\n callback(tc);\n } else {\n ajax({\n url: url,\n dataType: 'json',\n success: function(data) {\n try {\n tc = new TimelineConfig(data);\n } catch (e) {\n tc = new TimelineConfig();\n tc.logError(e);\n }\n callback(tc);\n },\n error: function(xhr, errorType, error) {\n tc = new TimelineConfig();\n if (errorType == 'parsererror') {\n var error = new TLError(\"invalid_url_err\");\n } else {\n var error = new TLError(\"unknown_read_err\", errorType)\n }\n tc.logError(error);\n callback(tc);\n }\n });\n\n }\n}\n\nfunction handleRow(event, timeline_config) {\n var row_type = 'event';\n if (typeof(event.type) != 'undefined') {\n row_type = event.type;\n delete event.type;\n }\n if (row_type == 'title') {\n if (!timeline_config.title) {\n timeline_config.title = event;\n } else {\n timeline_config.warnings.push(\"Multiple title slides detected.\");\n timeline_config.events.push(event);\n }\n } else if (row_type == 'era') {\n timeline_config.eras.push(event);\n } else {\n timeline_config.events.push(event);\n }\n}","import { SCALES, BIG_DATE_SCALES } from \"../date/TLDate\";\nimport TLError from \"../core/TLError\";\n\n/* AxisHelper\n Strategies for laying out the timenav\n markers and time axis\n Intended as a private class -- probably only known to TimeScale\n Get them using the exported getBestHelper function\n================================================== */\nclass AxisHelper {\n constructor(options) {\n\t\tif (options) {\n this.scale = options.scale;\n\t this.minor = options.minor;\n\t this.major = options.major;\n\t\t} else {\n throw new TLError(\"axis_helper_no_options_err\")\n }\n \n }\n \n getPixelsPerTick(pixels_per_milli) {\n return pixels_per_milli * this.minor.factor;\n }\n\n getMajorTicks(timescale) {\n\t\treturn this._getTicks(timescale, this.major)\n }\n\n getMinorTicks(timescale) {\n return this._getTicks(timescale, this.minor)\n }\n\n _getTicks(timescale, option) {\n\n var factor_scale = timescale._scaled_padding * option.factor;\n var first_tick_time = timescale._earliest - factor_scale;\n var last_tick_time = timescale._latest + factor_scale;\n var ticks = []\n for (var i = first_tick_time; i < last_tick_time; i += option.factor) {\n ticks.push(timescale.getDateFromTime(i).floor(option.name));\n }\n\n return {\n name: option.name,\n ticks: ticks\n }\n\n }\n\n}\nvar HELPERS = {};\n\nvar setHelpers = function(scale_type, scales) {\n HELPERS[scale_type] = [];\n \n for (var idx = 0; idx < scales.length - 1; idx++) {\n var minor = scales[idx];\n var major = scales[idx+1];\n HELPERS[scale_type].push(new AxisHelper({\n scale: minor[3],\n minor: { name: minor[0], factor: minor[1]},\n major: { name: major[0], factor: major[1]}\n }));\n }\n};\n\nsetHelpers('human', SCALES);\nsetHelpers('cosmological', BIG_DATE_SCALES);\n\n\nexport function getBestHelper(ts,optimal_tick_width) {\n if (typeof(optimal_tick_width) != 'number' ) {\n optimal_tick_width = 100;\n }\n var ts_scale = ts.getScale();\n var helpers = HELPERS[ts_scale];\n \n if (!helpers) {\n throw new TLError(\"axis_helper_scale_err\", ts_scale);\n }\n \n var prev = null;\n for (var idx = 0; idx < helpers.length; idx++) {\n var curr = helpers[idx];\n var pixels_per_tick = curr.getPixelsPerTick(ts._pixels_per_milli);\n if (pixels_per_tick > optimal_tick_width) {\n if (prev == null) return curr;\n var curr_dist = Math.abs(optimal_tick_width - pixels_per_tick);\n var prev_dist = Math.abs(optimal_tick_width - pixels_per_tick);\n if (curr_dist < prev_dist) {\n return curr;\n } else {\n return prev;\n }\n }\n prev = curr;\n }\n return helpers[helpers.length - 1]; // last resort \n}\n","import { mergeData } from \"../core/Util\"\nimport TLError from \"../core/TLError\"\n\nimport { TLDate, BigDate, BigYear, SCALES } from \"../date/TLDate\"\nimport { getBestHelper } from \"./AxisHelper\"\n\n// Date Format Lookup, map TLDate.SCALES names to...\nconst AXIS_TICK_DATEFORMAT_LOOKUP = {\n millisecond: 'time_milliseconds', // ...Language.<code>.dateformats\n second: 'time_short',\n minute: 'time_no_seconds_short',\n hour: 'time_no_minutes_short',\n day: 'full_short',\n month: 'month_short',\n year: 'year',\n decade: 'year',\n century: 'year',\n millennium: 'year',\n age: 'compact', // ...Language.<code>.bigdateformats\n epoch: 'compact',\n era: 'compact',\n eon: 'compact',\n eon2: 'compact'\n}\n\nexport class TimeScale {\n\n constructor(timeline_config, options) {\n\n var slides = timeline_config.events;\n this._scale = timeline_config.scale;\n\n options = mergeData({ // establish defaults\n display_width: 500,\n screen_multiplier: 3,\n max_rows: null\n }, options);\n\n this._display_width = options.display_width;\n this._screen_multiplier = options.screen_multiplier;\n this._pixel_width = this._screen_multiplier * this._display_width;\n\n this._group_labels = undefined;\n this._positions = [];\n this._pixels_per_milli = 0;\n\n this._earliest = timeline_config.getEarliestDate().getTime();\n this._latest = timeline_config.getLatestDate().getTime();\n this._span_in_millis = this._latest - this._earliest;\n if (this._span_in_millis <= 0) {\n this._span_in_millis = this._computeDefaultSpan(timeline_config);\n }\n this._average = (this._span_in_millis) / slides.length;\n\n this._pixels_per_milli = this.getPixelWidth() / this._span_in_millis;\n\n this._axis_helper = getBestHelper(this);\n\n this._scaled_padding = (1 / this.getPixelsPerTick()) * (this._display_width / 2)\n this._computePositionInfo(slides, options.max_rows);\n }\n\n _computeDefaultSpan(timeline_config) {\n // this gets called when all events are at the same instant,\n // or maybe when the span_in_millis is > 0 but still below a desired threshold\n if (timeline_config.scale == 'human') {\n var formats = {}\n for (var i = 0; i < timeline_config.events.length; i++) {\n var fmt = timeline_config.events[i].start_date.findBestFormat();\n formats[fmt] = (formats[fmt]) ? formats[fmt] + 1 : 1;\n };\n\n for (var i = SCALES.length - 1; i >= 0; i--) {\n if (formats.hasOwnProperty(SCALES[i][0])) {\n var scale = SCALES[SCALES.length - 1]; // default\n if (SCALES[i + 1]) {\n scale = SCALES[i + 1]; // one larger than the largest in our data\n }\n return scale[1]\n }\n };\n return 365 * 24 * 60 * 60 * 1000; // default to a year?\n }\n\n return 200000; // what is the right handling for cosmo dates?\n }\n getGroupLabels() {\n /*\n return an array of objects, one per group, in the order (top to bottom) that the groups are expected to appear. Each object will have two properties:\n * label (the string as specified in one or more 'group' properties of events in the configuration)\n * rows (the number of rows occupied by events associated with the label. )\n */\n return (this._group_labels || []);\n }\n\n getScale() {\n return this._scale;\n }\n\n getNumberOfRows() {\n return this._number_of_rows\n }\n\n getPixelWidth() {\n return this._pixel_width;\n }\n\n getPosition(time_in_millis) {\n // be careful using millis, as they won't scale to cosmological time.\n // however, we're moving to make the arg to this whatever value\n // comes from TLDate.getTime() which could be made smart about that --\n // so it may just be about the naming.\n return (time_in_millis - this._earliest) * this._pixels_per_milli\n }\n\n getPositionInfo(idx) {\n return this._positions[idx];\n }\n\n getPixelsPerTick() {\n return this._axis_helper.getPixelsPerTick(this._pixels_per_milli);\n }\n\n getTicks() {\n return {\n major: this._axis_helper.getMajorTicks(this),\n minor: this._axis_helper.getMinorTicks(this)\n }\n }\n\n getDateFromTime(t) {\n if (this._scale == 'human') {\n return new TLDate(t);\n } else if (this._scale == 'cosmological') {\n return new BigDate(new BigYear(t));\n }\n throw new TLError(\"time_scale_scale_err\", this._scale);\n }\n\n getMajorScale() {\n return this._axis_helper.major.name;\n }\n\n getMinorScale() {\n return this._axis_helper.minor.name;\n }\n\n _assessGroups(slides) {\n var groups = [];\n var empty_group = false;\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].group) {\n if (groups.indexOf(slides[i].group) < 0) {\n groups.push(slides[i].group);\n } else {\n empty_group = true;\n }\n }\n };\n if (groups.length && empty_group) {\n groups.push('');\n }\n return groups;\n }\n\n /* Compute the marker row positions, minimizing the number of\n overlaps.\n\n @positions = list of objects from this._positions\n @rows_left = number of rows available (assume > 0)\n */\n _computeRowInfo(positions, rows_left) {\n var lasts_in_row = [];\n var n_overlaps = 0;\n\n for (var i = 0; i < positions.length; i++) {\n var pos_info = positions[i];\n var overlaps = [];\n\n // See if we can add item to an existing row without\n // overlapping the previous item in that row\n delete pos_info.row;\n\n for (var j = 0; j < lasts_in_row.length; j++) {\n overlaps.push(lasts_in_row[j].end - pos_info.start);\n if (overlaps[j] <= 0) {\n pos_info.row = j;\n lasts_in_row[j] = pos_info;\n break;\n }\n }\n\n // If we couldn't add to an existing row without overlap...\n if (typeof(pos_info.row) == 'undefined') {\n if (rows_left === null) {\n // Make a new row\n pos_info.row = lasts_in_row.length;\n lasts_in_row.push(pos_info);\n } else if (rows_left > 0) {\n // Make a new row\n pos_info.row = lasts_in_row.length;\n lasts_in_row.push(pos_info);\n rows_left--;\n } else {\n // Add to existing row with minimum overlap.\n var min_overlap = Math.min.apply(null, overlaps);\n var idx = overlaps.indexOf(min_overlap);\n pos_info.row = idx;\n if (pos_info.end > lasts_in_row[idx].end) {\n lasts_in_row[idx] = pos_info;\n }\n n_overlaps++;\n }\n }\n }\n\n return { n_rows: lasts_in_row.length, n_overlaps: n_overlaps };\n }\n\n /* Compute marker positions. If using groups, this._number_of_rows\n will never be less than the number of groups.\n\n @max_rows = total number of available rows\n @default_marker_width should be in pixels\n */\n _computePositionInfo(slides, max_rows, default_marker_width) {\n default_marker_width = default_marker_width || 100;\n\n var groups = [];\n var empty_group = false;\n\n // Set start/end/width; enumerate groups\n for (var i = 0; i < slides.length; i++) {\n var pos_info = {\n start: this.getPosition(slides[i].start_date.getTime())\n };\n this._positions.push(pos_info);\n\n if (typeof(slides[i].end_date) != 'undefined') {\n var end_pos = this.getPosition(slides[i].end_date.getTime());\n pos_info.width = end_pos - pos_info.start;\n if (pos_info.width > default_marker_width) {\n pos_info.end = pos_info.start + pos_info.width;\n } else {\n pos_info.end = pos_info.start + default_marker_width;\n }\n } else {\n pos_info.width = default_marker_width;\n pos_info.end = pos_info.start + default_marker_width;\n }\n\n if (slides[i].group) {\n if (groups.indexOf(slides[i].group) < 0) {\n groups.push(slides[i].group);\n }\n } else {\n empty_group = true;\n }\n }\n\n if (!(groups.length)) {\n var result = this._computeRowInfo(this._positions, max_rows);\n this._number_of_rows = result.n_rows;\n } else {\n if (empty_group) {\n groups.push(\"\");\n }\n\n // Init group info\n var group_info = [];\n\n for (var i = 0; i < groups.length; i++) {\n group_info[i] = {\n label: groups[i],\n idx: i,\n positions: [],\n n_rows: 1, // default\n n_overlaps: 0\n };\n }\n\n for (var i = 0; i < this._positions.length; i++) {\n var pos_info = this._positions[i];\n\n pos_info.group = groups.indexOf(slides[i].group || \"\");\n pos_info.row = 0;\n\n var gi = group_info[pos_info.group];\n for (var j = gi.positions.length - 1; j >= 0; j--) {\n if (gi.positions[j].end > pos_info.start) {\n gi.n_overlaps++;\n }\n }\n\n gi.positions.push(pos_info);\n }\n\n var n_rows = groups.length; // start with 1 row per group\n\n while (true) {\n // Count free rows available\n var rows_left = Math.max(0, max_rows - n_rows);\n if (!rows_left) {\n break; // no free rows, nothing to do\n }\n\n // Sort by # overlaps, idx\n group_info.sort(function(a, b) {\n if (a.n_overlaps > b.n_overlaps) {\n return -1;\n } else if (a.n_overlaps < b.n_overlaps) {\n return 1;\n }\n return a.idx - b.idx;\n });\n if (!group_info[0].n_overlaps) {\n break; // no overlaps, nothing to do\n }\n\n // Distribute free rows among groups with overlaps\n var n_rows = 0;\n for (var i = 0; i < group_info.length; i++) {\n var gi = group_info[i];\n\n if (gi.n_overlaps && rows_left) {\n var res = this._computeRowInfo(gi.positions, gi.n_rows + 1);\n gi.n_rows = res.n_rows; // update group info\n gi.n_overlaps = res.n_overlaps;\n rows_left--; // update rows left\n }\n\n n_rows += gi.n_rows; // update rows used\n }\n }\n\n // Set number of rows\n this._number_of_rows = n_rows;\n\n // Set group labels; offset row positions\n this._group_labels = [];\n\n group_info.sort(function(a, b) { return a.idx - b.idx; });\n\n for (var i = 0, row_offset = 0; i < group_info.length; i++) {\n this._group_labels.push({\n label: group_info[i].label,\n rows: group_info[i].n_rows\n });\n\n for (var j = 0; j < group_info[i].positions.length; j++) {\n var pos_info = group_info[i].positions[j];\n pos_info.row += row_offset;\n }\n\n row_offset += group_info[i].n_rows;\n }\n }\n\n }\n\n\n\n\n /**\n * To handle formatting cosmological ticks correctly, let the TimeScale (which knows)\n * give us the format for tick labels on the time axis.\n * @param {String} name - the \"level\" of dates in the axis\n */\n getAxisTickDateFormat(name) {\n if (this._scale == 'cosmological') {\n return 'compact' // is this heavy-handed? cosmologic\n }\n\n return AXIS_TICK_DATEFORMAT_LOOKUP[name]\n\n }\n}","import { classMixin, mergeData } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport * as DOM from \"../dom/DOM\"\n\nexport class TimeGroup {\n\tconstructor(data) {\n\t\t\n\t\t// DOM ELEMENTS\n\t\tthis._el = {\n\t\t\tparent: {},\n\t\t\tcontainer: {},\n\t\t\tmessage: {}\n\t\t};\n\t\t\n\t\t//Options\n\t\tthis.options = {\n\t\t\twidth: \t\t\t\t\t600,\n\t\t\theight: \t\t\t\t600\n\t\t};\n\t\t\n\t\t// Data\n\t\tthis.data = {\n\t\t\tlabel: \"\",\n\t\t\trows: 1\n\t\t};\n\t\t\n\t\t\n\t\tthis._el.container = DOM.create(\"div\", \"tl-timegroup\"); \n\t\t\n\t\t// Merge Data\n\t\tmergeData(this.data, data);\n\t\t\n\t\t// Animation\n\t\tthis.animator = {};\n\t\t\n\t\t\n\t\tthis._initLayout();\n\t\tthis._initEvents();\n\t}\n\t\n\t/*\tPublic\n\t================================================== */\n\t\n\t\n\t\n\t/*\tUpdate Display\n\t================================================== */\n\tupdateDisplay(w, h) {\n\t\t\n\t}\n\t\n\tsetRowPosition(n, h) {\n\t\tthis.options.height = h * this.data.rows;\n\t\tthis.setPosition({top:n});\n\t\tthis._el.container.style.height = this.options.height + \"px\";\n\t\t\n\t}\n\t\n\tsetAlternateRowColor(alternate, hide) {\n\t\tvar class_name = \"tl-timegroup\";\n\t\tif (alternate) {\n\t\t\tclass_name += \" tl-timegroup-alternate\";\n\t\t}\n\t\tif (hide) {\n\t\t\tclass_name += \" tl-timegroup-hidden\";\n\t\t}\n\t\tthis._el.container.className = class_name;\n\t}\n\t\n\t/*\tEvents\n\t================================================== */\n\n\t\n\t_onMouseClick() {\n\t\tthis.fire(\"clicked\", this.options);\n\t}\n\n\t\n\t/*\tPrivate Methods\n\t================================================== */\n\t_initLayout () {\n\t\t\n\t\t// Create Layout\n\t\tthis._el.message = DOM.create(\"div\", \"tl-timegroup-message\", this._el.container);\n\t\tthis._el.message.innerHTML = this.data.label;\n\t\t\n\t\t\n\t}\n\t\n\t_initEvents () {\n\t\tDOMEvent.addListener(this._el.container, 'click', this._onMouseClick, this);\n\t}\n\t\n\t// Update Display\n\t_updateDisplay(width, height, animate) {\n\t\t\n\t}\n\t\n}\n\nclassMixin(TimeGroup, Events, DOMMixins)\n","import { classMixin, unlinkify, mergeData } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport * as Browser from \"../core/Browser\"\nimport { removeClass } from \"../dom/DOMUtil\";\nimport { easeInSpline } from \"../animation/Ease\";\nimport * as DOM from \"../dom/DOM\"\n\n/**\n * A TimeEra represents a span of time marked along the edge of the time \n * slider. It must have a \n */\nexport class TimeEra {\n constructor(start_date, end_date, headline, options) {\n\n\n this.start_date = start_date\n this.end_date = end_date\n this.headline = headline\n\n // DOM Elements\n this._el = {\n container: {},\n background: {},\n content_container: {},\n content: {},\n text: {}\n };\n\n // Components\n this._text = {};\n\n // State\n this._state = {\n loaded: false\n };\n\n // Options\n this.options = {\n duration: 1000,\n ease: easeInSpline,\n width: 600,\n height: 600,\n marker_width_min: 100\n };\n\n // Actively Displaying\n this.active = false;\n\n // Animation Object\n this.animator = {};\n\n // End date\n this.has_end_date = false;\n\n // Merge Data and Options\n mergeData(this.options, options);\n\n this._initLayout();\n this._initEvents();\n\n\n }\n\n /*\tAdding, Hiding, Showing etc\n ================================================== */\n show() {\n\n }\n\n hide() {\n\n }\n\n setActive(is_active) {\n\n }\n\n addTo(container) {\n container.appendChild(this._el.container);\n }\n\n removeFrom(container) {\n container.removeChild(this._el.container);\n }\n\n updateDisplay(w, h) {\n this._updateDisplay(w, h);\n }\n\n getLeft() {\n return this._el.container.style.left.slice(0, -2);\n }\n\n getTime() {\n return this.start_date.getTime();\n }\n\n getEndTime() {\n\n if (this.end_date) {\n return this.end_date.getTime();\n } else {\n return false;\n }\n }\n\n setHeight(h) {\n var text_line_height = 12,\n text_lines = 1;\n\n this._el.content_container.style.height = h + \"px\";\n this._el.content.className = \"tl-timeera-content\";\n\n // Handle number of lines visible vertically\n\n if (Browser.webkit) {\n text_lines = Math.floor(h / (text_line_height + 2));\n if (text_lines < 1) {\n text_lines = 1;\n }\n this._text.className = \"tl-headline\";\n this._text.style.webkitLineClamp = text_lines;\n } else {\n text_lines = h / text_line_height;\n if (text_lines > 1) {\n this._text.className = \"tl-headline tl-headline-fadeout\";\n } else {\n this._text.className = \"tl-headline\";\n }\n this._text.style.height = (text_lines * text_line_height) + \"px\";\n }\n\n }\n\n setWidth(w) {\n if (this.end_date) {\n this._el.container.style.width = w + \"px\";\n\n if (w > this.options.marker_width_min) {\n this._el.content_container.style.width = w + \"px\";\n this._el.content_container.className = \"tl-timeera-content-container tl-timeera-content-container-long\";\n } else {\n this._el.content_container.style.width = this.options.marker_width_min + \"px\";\n this._el.content_container.className = \"tl-timeera-content-container\";\n }\n }\n\n }\n\n setClass(n) {\n this._el.container.className = n;\n }\n\n setRowPosition(n, remainder) {\n this.setPosition({ top: n });\n\n if (remainder < 56) {\n removeClass(this._el.content_container, \"tl-timeera-content-container-small\");\n }\n }\n\n setColor(color_num) {\n this._el.container.className = 'tl-timeera tl-timeera-color' + color_num;\n }\n\n /*\tEvents\n ================================================== */\n\n\n /*\tPrivate Methods\n ================================================== */\n _initLayout() {\n // Create Layout\n this._el.container = DOM.create(\"div\", \"tl-timeera\");\n\n if (this.end_date) {\n this.has_end_date = true;\n this._el.container.className = 'tl-timeera tl-timeera-with-end';\n }\n\n this._el.content_container = DOM.create(\"div\", \"tl-timeera-content-container\", this._el.container);\n\n this._el.background = DOM.create(\"div\", \"tl-timeera-background\", this._el.content_container);\n\n this._el.content = DOM.create(\"div\", \"tl-timeera-content\", this._el.content_container);\n\n\n\n // Text\n this._el.text = DOM.create(\"div\", \"tl-timeera-text\", this._el.content);\n this._text = DOM.create(\"h2\", \"tl-headline\", this._el.text);\n if (this.headline && this.headline != \"\") {\n this._text.innerHTML = unlinkify(this.headline);\n }\n\n\n\n // Fire event that the slide is loaded\n this.onLoaded();\n\n }\n\n _initEvents() {\n\n }\n\n // Update Display\n _updateDisplay(width, height, layout) {\n\n if (width) {\n this.options.width = width;\n }\n\n if (height) {\n this.options.height = height;\n }\n\n }\n\n}\n\nclassMixin(TimeEra, Events, DOMMixins)","import { classMixin, mergeData } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { I18NMixins } from \"../language/I18NMixins\"\nimport { easeInSpline } from \"../animation/Ease\";\nimport * as DOM from \"../dom/DOM\"\n\nexport class TimeAxis {\n constructor(elem, options, language) {\n\n if (language) {\n this.setLanguage(language)\n }\n // DOM Elements\n this._el = {\n container: {},\n content_container: {},\n major: {},\n minor: {},\n };\n\n // Components\n this._text = {};\n\n // State\n this._state = {\n loaded: false\n };\n\n\n // Data\n this.data = {};\n\n // Options\n this.options = {\n duration: 1000,\n ease: easeInSpline,\n width: 600,\n height: 600\n };\n\n // Actively Displaying\n this.active = false;\n\n // Animation Object\n this.animator = {};\n\n // Axis Helper\n this.axis_helper = {};\n\n // Minor tick dom element array\n this.minor_ticks = [];\n\n // Minor tick dom element array\n this.major_ticks = [];\n\n // Main element\n if (typeof elem === 'object') {\n this._el.container = elem;\n } else {\n this._el.container = DOM.get(elem);\n }\n\n // Merge Data and Options\n mergeData(this.options, options);\n\n this._initLayout();\n this._initEvents();\n\n }\n\n /*\tAdding, Hiding, Showing etc\n ================================================== */\n show() {\n\n }\n\n hide() {\n\n }\n\n addTo(container) {\n container.appendChild(this._el.container);\n }\n\n removeFrom(container) {\n container.removeChild(this._el.container);\n }\n\n updateDisplay(w, h) {\n this._updateDisplay(w, h);\n }\n\n getLeft() {\n return this._el.container.style.left.slice(0, -2);\n }\n\n drawTicks(timescale, optimal_tick_width) {\n\n var ticks = timescale.getTicks();\n\n // FADE OUT\n this._el.major.className = \"tl-timeaxis-major\";\n this._el.minor.className = \"tl-timeaxis-minor\";\n this._el.major.style.opacity = 0;\n this._el.minor.style.opacity = 0;\n\n // CREATE MAJOR TICKS\n this.major_ticks = this._createTickElements(\n ticks['major'].ticks,\n this._el.major,\n timescale.getAxisTickDateFormat(ticks['major'].name)\n );\n\n // CREATE MINOR TICKS\n this.minor_ticks = this._createTickElements(\n ticks['minor'].ticks,\n this._el.minor,\n timescale.getAxisTickDateFormat(ticks['minor'].name),\n ticks['major'].ticks\n );\n\n this.positionTicks(timescale, optimal_tick_width, true);\n\n // FADE IN\n this._el.major.className = \"tl-timeaxis-major tl-animate-opacity tl-timeaxis-animate-opacity\";\n this._el.minor.className = \"tl-timeaxis-minor tl-animate-opacity tl-timeaxis-animate-opacity\";\n this._el.major.style.opacity = 1;\n this._el.minor.style.opacity = 1;\n }\n\n _createTickElements(ts_ticks, tick_element, dateformat, ticks_to_skip) {\n tick_element.innerHTML = \"\";\n var skip_times = {};\n\n var yearZero = new Date(-1, 13, -30);\n skip_times[yearZero.getTime()] = true;\n\n if (ticks_to_skip) {\n for (var i = 0; i < ticks_to_skip.length; i++) {\n skip_times[ticks_to_skip[i].getTime()] = true;\n }\n }\n\n var tick_elements = []\n for (var i = 0; i < ts_ticks.length; i++) {\n var ts_tick = ts_ticks[i];\n if (!(ts_tick.getTime() in skip_times)) {\n var tick = DOM.create(\"div\", \"tl-timeaxis-tick\", tick_element),\n tick_text = DOM.create(\"span\", \"tl-timeaxis-tick-text tl-animate-opacity\", tick);\n\n let tick_display_date = ts_tick.getDisplayDate(this.getLanguage(), dateformat)\n tick_text.innerHTML = tick_display_date;\n\n tick_elements.push({\n tick: tick,\n tick_text: tick_text,\n display_date: tick_display_date,\n date: ts_tick\n });\n }\n }\n return tick_elements;\n }\n\n positionTicks(timescale, optimal_tick_width, no_animate) {\n\n // Handle Animation\n if (no_animate) {\n this._el.major.className = \"tl-timeaxis-major\";\n this._el.minor.className = \"tl-timeaxis-minor\";\n } else {\n this._el.major.className = \"tl-timeaxis-major tl-timeaxis-animate\";\n this._el.minor.className = \"tl-timeaxis-minor tl-timeaxis-animate\";\n }\n\n this._positionTickArray(this.major_ticks, timescale, optimal_tick_width);\n this._positionTickArray(this.minor_ticks, timescale, optimal_tick_width);\n\n }\n\n _positionTickArray(tick_array, timescale, optimal_tick_width) {\n // Poition Ticks & Handle density of ticks\n if (tick_array[1] && tick_array[0]) {\n var distance = (timescale.getPosition(tick_array[1].date.getMillisecond()) - timescale.getPosition(tick_array[0].date.getMillisecond())),\n fraction_of_array = 1;\n\n\n if (distance < optimal_tick_width) {\n fraction_of_array = Math.round(optimal_tick_width / timescale.getPixelsPerTick());\n }\n\n var show = 1;\n\n for (var i = 0; i < tick_array.length; i++) {\n\n var tick = tick_array[i];\n\n // Poition Ticks\n tick.tick.style.left = timescale.getPosition(tick.date.getMillisecond()) + \"px\";\n tick.tick_text.innerHTML = tick.display_date;\n\n // Handle density of ticks\n if (fraction_of_array > 1) {\n if (show >= fraction_of_array) {\n show = 1;\n tick.tick_text.style.opacity = 1;\n tick.tick.className = \"tl-timeaxis-tick\";\n } else {\n show++;\n tick.tick_text.style.opacity = 0;\n tick.tick.className = \"tl-timeaxis-tick tl-timeaxis-tick-hidden\";\n }\n } else {\n tick.tick_text.style.opacity = 1;\n tick.tick.className = \"tl-timeaxis-tick\";\n }\n\n };\n }\n }\n\n /*\tEvents\n ================================================== */\n\n\n /*\tPrivate Methods\n ================================================== */\n _initLayout() {\n this._el.content_container = DOM.create(\"div\", \"tl-timeaxis-content-container\", this._el.container);\n this._el.major = DOM.create(\"div\", \"tl-timeaxis-major\", this._el.content_container);\n this._el.minor = DOM.create(\"div\", \"tl-timeaxis-minor\", this._el.content_container);\n\n // Fire event that the slide is loaded\n this.onLoaded();\n }\n\n _initEvents() {\n\n }\n\n // Update Display\n _updateDisplay(width, height, layout) {\n\n if (width) {\n this.options.width = width;\n }\n\n if (height) {\n this.options.height = height;\n }\n\n }\n\n}\n\nclassMixin(TimeAxis, Events, DOMMixins, I18NMixins)","import { classMixin, setData, mergeData, htmlify, linkify, trace } from \"../../core/Util\"\nimport Events from \"../../core/Events\"\nimport * as DOM from \"../../dom/DOM\"\n\nexport class Text {\n\tconstructor(data, options, add_to_container) {\n\n\t\tthis._el = { // defaults\n\t\t\tcontainer: { },\n\t\t\tcontent_container: { },\n\t\t\tcontent: { },\n\t\t\theadline: { },\n\t\t\tdate: { }\n\t\t}\n\n\t\tthis.options = { // defaults\n\t\t\ttitle: false\n\t\t}\n\n\t\tthis.data = { // defaults\n\t\t\tunique_id: \"\",\n\t\t\theadline: \"headline\",\n\t\t\ttext: \"text\"\n\t\t}\n\n\t\tsetData(this, data); // override defaults\n\t\t\n\t\t// Merge Options\n\t\tmergeData(this.options, options);\n\t\t\n\t\tthis._el.container = DOM.create(\"div\", \"tl-text\");\n\t\tthis._el.container.id = this.data.unique_id;\n\t\t\n\t\tthis._initLayout();\n\t\t\n\t\tif (add_to_container) {\n\t\t\tadd_to_container.appendChild(this._el.container);\n\t\t};\n\t\t\n\t}\n\t\n\t/*\tAdding, Hiding, Showing etc\n\t================================================== */\n\tshow() {\n\t\t\n\t}\n\t\n\thide() {\n\t\t\n\t}\n\t\n\taddTo(container) {\n\t\tcontainer.appendChild(this._el.container);\n\t\t//this.onAdd();\n\t}\n\t\n\tremoveFrom(container) {\n\t\tcontainer.removeChild(this._el.container);\n\t}\n\t\n\theadlineHeight() {\n\t\treturn this._el.headline.offsetHeight + 40;\n\t}\n\t\n\taddDateText(str) {\n\t\tthis._el.date.innerHTML = str;\n\t}\n\t\n\t/*\tEvents\n\t================================================== */\n\tonLoaded() {\n\t\tthis.fire(\"loaded\", this.data);\n\t}\n\t\n\tonAdd() {\n\t\tthis.fire(\"added\", this.data);\n\t}\n\n\tonRemove() {\n\t\tthis.fire(\"removed\", this.data);\n\t}\n\t\n\t/*\tPrivate Methods\n\t================================================== */\n\t_initLayout() {\n\t\t\n\t\t// Create Layout\n\t\tthis._el.content_container = DOM.create(\"div\", \"tl-text-content-container\", this._el.container);\n\t\t\n\t\t// Date\n\t\tthis._el.date = DOM.create(\"h3\", \"tl-headline-date\", this._el.content_container);\n\t\t\n\t\t// Headline\n\t\tif (this.data.headline != \"\") {\n\t\t\tvar headline_class = \"tl-headline\";\n\t\t\tif (this.options.title) {\n\t\t\t\theadline_class = \"tl-headline tl-headline-title\";\n\t\t\t}\n\t\t\tthis._el.headline = DOM.create(\"h2\", headline_class, this._el.content_container);\n\t\t\tthis._el.headline.innerHTML\t\t= this.data.headline;\n\t\t}\n\n\t\t// Text\n\t\tif (this.data.text != \"\") {\n\t\t\tvar text_content = \"\";\n\t\t\ttext_content += htmlify(this.options.autolink == true ? linkify(this.data.text) : this.data.text);\n\t\t\tthis._el.content\t\t\t\t= DOM.create(\"div\", \"tl-text-content\", this._el.content_container);\n\t\t\tthis._el.content.innerHTML\t\t= text_content;\n\t\t}\n\n\t\t// Fire event that the slide is loaded\n\t\tthis.onLoaded();\n\n\t}\n\n}\n\nclassMixin(Text, Events)","import { classMixin, mergeData, linkify, } from \"../core/Util\"\nimport { I18NMixins } from \"../language/I18NMixins\";\nimport Events from \"../core/Events\"\nimport * as DOM from \"../dom/DOM\"\nimport * as Browser from \"../core/Browser\"\nimport { Text } from \"./types/Text\"\nimport Message from \"../ui/Message\"\n\n\nclass Media {\n constructor(data, options, language) { //add_to_container) {\n if (language) {\n this.setLanguage(language)\n }\n // DOM ELEMENTS\n this._el = {\n container: {},\n content_container: {},\n content: {},\n content_item: {},\n content_link: {},\n caption: null,\n credit: null,\n parent: {},\n link: null\n };\n\n // Player (If Needed)\n this.player = null;\n\n // Timer (If Needed)\n this.timer = null;\n this.load_timer = null;\n\n // Message\n this.message = null;\n\n // Media ID\n this.media_id = null;\n\n // State\n this._state = {\n loaded: false,\n show_meta: false,\n media_loaded: false\n };\n\n // Data\n this.data = {\n unique_id: null,\n url: null,\n credit: null,\n caption: null,\n credit_alternate: null,\n caption_alternate: null,\n link: null,\n link_target: null\n };\n\n //Options\n this.options = {\n api_key_flickr: \"bd3a7c45ddd52f3101825d41563a6125\",\n api_key_googlemaps: \"AIzaSyB9dW8e_iRrATFa8g24qB6BDBGdkrLDZYI\",\n api_key_embedly: \"\", // ae2da610d1454b66abdf2e6a4c44026d\n credit_height: 0,\n caption_height: 0,\n background: 0 // is background media (for slide)\n };\n\n this.animator = {};\n\n // Merge Data and Options\n mergeData(this.options, options);\n mergeData(this.data, data);\n\n // Don't create DOM elements if this is background media\n if (!this.options.background) {\n this._el.container = DOM.create(\"div\", \"tl-media\");\n\n if (this.data.unique_id) {\n this._el.container.id = this.data.unique_id;\n }\n\n this._initLayout();\n\n }\n }\n\n loadMedia() {\n var self = this;\n\n if (!this._state.loaded) {\n try {\n this.load_timer = setTimeout(function() {\n self.loadingMessage();\n self._loadMedia();\n // self._state.loaded = true; handled in onLoaded()\n self._updateDisplay();\n }, 1200);\n } catch (e) {\n trace(\"Error loading media for \", this._media);\n trace(e);\n }\n }\n }\n\n _updateMessage(msg) {\n if (this.message) {\n this.message.updateMessage(msg);\n }\n }\n\n loadingMessage() {\n this._updateMessage(this._('loading') + \" \" + this.options.media_name);\n }\n\n errorMessage(msg) {\n if (msg) {\n msg = this._('error') + \": \" + msg;\n } else {\n msg = this._('error');\n }\n this._updateMessage(msg);\n }\n\n updateMediaDisplay(layout) {\n if (this._state.loaded && !this.options.background) {\n\n if (Browser.mobile) {\n this._el.content_item.style.maxHeight = (this.options.height / 2) + \"px\";\n } else {\n this._el.content_item.style.maxHeight = this.options.height - this.options.credit_height - this.options.caption_height - 30 + \"px\";\n }\n\n //this._el.content_item.style.maxWidth = this.options.width + \"px\";\n this._el.container.style.maxWidth = this.options.width + \"px\";\n // Fix for max-width issues in Firefox\n if (Browser.firefox) {\n if (this._el.content_item.offsetWidth > this._el.content_item.offsetHeight) {\n //this._el.content_item.style.width = \"100%\";\n }\n }\n\n this._updateMediaDisplay(layout);\n\n if (this._state.media_loaded) {\n if (this._el.credit) {\n this._el.credit.style.width = this._el.content_item.offsetWidth + \"px\";\n }\n if (this._el.caption) {\n this._el.caption.style.width = this._el.content_item.offsetWidth + \"px\";\n }\n }\n\n }\n }\n\n /*\tMedia Specific\n ================================================== */\n _loadMedia() {\n // All overrides must call this.onLoaded() to set state\n this.onLoaded();\n }\n\n _updateMediaDisplay(l) {\n //this._el.content_item.style.maxHeight = (this.options.height - this.options.credit_height - this.options.caption_height - 16) + \"px\";\n if (Browser.firefox) {\n this._el.content_item.style.maxWidth = this.options.width + \"px\";\n this._el.content_item.style.width = \"auto\";\n }\n }\n\n _getMeta() {\n\n }\n\n _getImageURL(w, h) {\n // Image-based media types should return <img>-compatible src url\n return \"\";\n }\n\n /*\tPublic\n ================================================== */\n show() {\n\n }\n\n hide() {\n\n }\n\n addTo(container) {\n container.appendChild(this._el.container);\n this.onAdd();\n }\n\n removeFrom(container) {\n container.removeChild(this._el.container);\n this.onRemove();\n }\n\n getImageURL(w, h) {\n return this._getImageURL(w, h);\n }\n\n // Update Display\n updateDisplay(w, h, l) {\n this._updateDisplay(w, h, l);\n }\n\n stopMedia() {\n this._stopMedia();\n }\n\n loadErrorDisplay(message) {\n try {\n this._el.content.removeChild(this._el.content_item);\n } catch (e) {\n // if this._el.content_item isn't a child of this._el then just keep truckin\n }\n this._el.content_item = DOM.create(\"div\", \"tl-media-item tl-media-loaderror\", this._el.content);\n this._el.content_item.innerHTML = \"<div class='tl-icon-\" + this.options.media_type + \"'></div><p>\" + message + \"</p>\";\n\n // After Loaded\n this.onLoaded(true);\n }\n\n /*\tEvents\n ================================================== */\n onLoaded(error) {\n this._state.loaded = true;\n this.fire(\"loaded\", this.data);\n if (this.message) {\n this.message.hide();\n }\n if (!(error || this.options.background)) {\n this.showMeta();\n }\n this.updateDisplay();\n }\n\n onMediaLoaded(e) {\n this._state.media_loaded = true;\n this.fire(\"media_loaded\", this.data);\n if (this._el.credit) {\n this._el.credit.style.width = this._el.content_item.offsetWidth + \"px\";\n }\n if (this._el.caption) {\n this._el.caption.style.width = this._el.content_item.offsetWidth + \"px\";\n }\n }\n\n showMeta(credit, caption) {\n this._state.show_meta = true;\n // Credit\n if (this.data.credit && this.data.credit != \"\") {\n this._el.credit = DOM.create(\"div\", \"tl-credit\", this._el.content_container);\n this._el.credit.innerHTML = this.options.autolink == true ? linkify(this.data.credit) : this.data.credit;\n this.options.credit_height = this._el.credit.offsetHeight;\n }\n\n // Caption\n if (this.data.caption && this.data.caption != \"\") {\n this._el.caption = DOM.create(\"div\", \"tl-caption\", this._el.content_container);\n this._el.caption.innerHTML = this.options.autolink == true ? linkify(this.data.caption) : this.data.caption;\n this.options.caption_height = this._el.caption.offsetHeight;\n }\n\n if (!this.data.caption || !this.data.credit) {\n this.getMeta();\n }\n\n }\n\n getMeta() {\n this._getMeta();\n }\n\n updateMeta() {\n if (!this.data.credit && this.data.credit_alternate) {\n this._el.credit = DOM.create(\"div\", \"tl-credit\", this._el.content_container);\n this._el.credit.innerHTML = this.data.credit_alternate;\n this.options.credit_height = this._el.credit.offsetHeight;\n }\n\n if (!this.data.caption && this.data.caption_alternate) {\n this._el.caption = DOM.create(\"div\", \"tl-caption\", this._el.content_container);\n this._el.caption.innerHTML = this.data.caption_alternate;\n this.options.caption_height = this._el.caption.offsetHeight;\n }\n\n this.updateDisplay();\n }\n\n onAdd() {\n this.fire(\"added\", this.data);\n }\n\n onRemove() {\n this.fire(\"removed\", this.data);\n }\n\n /*\tPrivate Methods\n ================================================== */\n _initLayout() {\n\n // Message\n this.message = new Message(this._el.container, this.options, this.getLanguage());\n // this.message.addTo(this._el.container);\n\n // Create Layout\n this._el.content_container = DOM.create(\"div\", \"tl-media-content-container\", this._el.container);\n\n // Link\n if (this.data.link && this.data.link != \"\") {\n\n this._el.link = DOM.create(\"a\", \"tl-media-link\", this._el.content_container);\n this._el.link.href = this.data.link;\n if (this.data.link_target && this.data.link_target != \"\") {\n this._el.link.target = this.data.link_target;\n } else {\n this._el.link.target = \"_blank\";\n }\n\n if (this._el.link.target == '_blank') {\n this._el.link.setAttribute('rel', 'noopener');\n }\n\n this._el.content = DOM.create(\"div\", \"tl-media-content\", this._el.link);\n\n } else {\n this._el.content = DOM.create(\"div\", \"tl-media-content\", this._el.content_container);\n }\n\n\n }\n\n // Update Display\n _updateDisplay(w, h, l) {\n if (w) {\n this.options.width = w;\n\n }\n //this._el.container.style.width = this.options.width + \"px\";\n if (h) {\n this.options.height = h;\n }\n\n if (l) {\n this.options.layout = l;\n }\n\n if (this._el.credit) {\n this.options.credit_height = this._el.credit.offsetHeight;\n }\n if (this._el.caption) {\n this.options.caption_height = this._el.caption.offsetHeight + 5;\n }\n\n this.updateMediaDisplay(this.options.layout);\n\n }\n\n domCreate(...params) {\n return DOM.create(...params)\n }\n\n _stopMedia() {\n\n }\n\n}\n\nclassMixin(Media, Events, I18NMixins)\n\nexport { Media, Text }","import { Media } from \"../Media\"\nimport { unhtmlify, transformMediaURL } from \"../../core/Util\"\nimport * as Browser from \"../../core/Browser\"\n\nexport default class Image extends Media {\n\n _loadMedia() {\n // Loading Message\n this.loadingMessage();\n\n // Create media?\n if (!this.options.background) {\n this.createMedia();\n }\n\n // After loaded\n this.onLoaded();\n }\n\n createMedia() {\n var self = this,\n image_class = \"tl-media-item tl-media-image tl-media-shadow\";\n\n if (this.data.url.match(/.png(\\?.*)?$/) || this.data.url.match(/.svg(\\?.*)?$/)) {\n image_class = \"tl-media-item tl-media-image\"\n }\n\n this._el.content_item = this.domCreate(\"img\", image_class, this._el.content);\n\n if (this.data.alt) {\n this._el.content_item.alt = this.data.alt;\n } else if (this.data.caption) {\n this._el.content_item.alt = unhtmlify(this.data.caption);\n }\n\n if (this.data.title) {\n this._el.content_item.title = this.data.title;\n } else if (this.data.caption) {\n this._el.content_item.title = unhtmlify(this.data.caption);\n }\n\n // Media Loaded Event\n this._el.content_item.addEventListener('load', function(e) {\n self.onMediaLoaded();\n });\n\n this._el.content_item.src = this.getImageURL();\n }\n\n getImageURL(w, h) {\n return transformMediaURL(this.data.url);\n }\n\n _updateMediaDisplay(layout) {\n if (Browser.firefox) {\n //this._el.content_item.style.maxWidth = (this.options.width/2) - 40 + \"px\";\n this._el.content_item.style.width = \"auto\";\n }\n }\n\n}","/*\tLoad\n Loads External Javascript and CSS\n Adapted from LazyLoad and adjusted from earlier TimelineJS to\n not add an extra layer. Seems like we could simplify\n this, but leaving in in case users need support for older browsers.\n ================================================== */\n\n/*\nLazyLoad makes it easy and painless to lazily load one or more external\nJavaScript or CSS files on demand either during or after the rendering of a web\npage.\n\nSupported browsers include Firefox 2+, IE6+, Safari 3+ (including Mobile\nSafari), Google Chrome, and Opera 9+. Other browsers may or may not work and\nare not officially supported.\n\nVisit https://github.com/rgrove/lazyload/ for more info.\n\nCopyright (c) 2011 Ryan Grove <[email protected]>\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the 'Software'), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\nclass Loader {\n\n constructor(document) {\n this.doc = document\n this.pending = {}\n this.queue = { css: [], js: [] };\n this.styleSheets = document.styleSheets\n this.env = this.getEnv()\n this.head = this.doc.head || this.doc.getElementsByTagName('head')[0];\n this.pollCount = 0\n\n }\n\n\n\n // -- Private Methods --------------------------------------------------------\n\n /**\n Creates and returns an HTML element with the specified name and attributes.\n\n @method createNode\n @param {String} name element name\n @param {Object} attrs name/value mapping of element attributes\n @return {HTMLElement}\n @private\n */\n createNode(name, attrs) {\n var node = this.doc.createElement(name),\n attr;\n\n for (attr in attrs) {\n if (attrs.hasOwnProperty(attr)) {\n node.setAttribute(attr, attrs[attr]);\n }\n }\n\n return node;\n }\n\n /**\n Called when the current pending resource of the specified type has finished\n loading. Executes the associated callback (if any) and loads the next\n resource in the queue.\n\n @method finish\n @param {String} type resource type ('css' or 'js')\n @private\n */\n finish(type) {\n var p = this.pending[type],\n callback,\n urls;\n\n if (p) {\n callback = p.callback;\n urls = p.urls;\n\n urls.shift();\n this.pollCount = 0;\n\n // If this is the last of the pending URLs, execute the callback and\n // start the next request in the queue (if any).\n if (!urls.length) {\n callback && callback.call(p.context, p.obj);\n this.pending[type] = null;\n this.queue[type].length && this.load(type);\n }\n }\n }\n\n /**\n Populates the <code>env</code> variable with user agent and feature test\n information.\n\n @method getEnv\n @private\n */\n getEnv() {\n var ua = navigator.userAgent;\n\n var env = {\n // True if this browser supports disabling async mode on dynamically\n // created script nodes. See\n // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order\n async: this.doc.createElement('script').async === true\n };\n\n (env.webkit = /AppleWebKit\\//.test(ua)) ||\n (env.ie = /MSIE/.test(ua)) ||\n (env.opera = /Opera/.test(ua)) ||\n (env.gecko = /Gecko\\//.test(ua)) ||\n (env.unknown = true);\n\n return env;\n }\n\n /**\n Loads the specified resources, or the next resource of the specified type\n in the queue if no resources are specified. If a resource of the specified\n type is already being loaded, the new request will be queued until the\n first request has been finished.\n\n When an array of resource URLs is specified, those URLs will be loaded in\n parallel if it is possible to do so while preserving execution order. All\n browsers support parallel loading of CSS, but only Firefox and Opera\n support parallel loading of scripts. In other browsers, scripts will be\n queued and loaded one at a time to ensure correct execution order.\n\n @method load\n @param {String} type resource type ('css' or 'js')\n @param {String|Array} urls (optional) URL or array of URLs to load\n @param {Function} callback (optional) callback function to execute when the\n resource is loaded\n @param {Object} obj (optional) object to pass to the callback function\n @param {Object} context (optional) if provided, the callback function will\n be executed in this object's context\n @private\n */\n load(type, urls, callback, obj, context) {\n var _finish = function() { this.finish(type); }.bind(this),\n isCSS = type === 'css',\n nodes = [],\n i, len, node, p, pendingUrls, url;\n\n\n\n if (urls) {\n // If urls is a string, wrap it in an array. Otherwise assume it's an\n // array and create a copy of it so modifications won't be made to the\n // original.\n urls = typeof urls === 'string' ? [urls] : urls.concat();\n\n // Create a request object for each URL. If multiple URLs are specified,\n // the callback will only be executed after all URLs have been loaded.\n //\n // Sadly, Firefox and Opera are the only browsers capable of loading\n // scripts in parallel while preserving execution order. In all other\n // browsers, scripts must be loaded sequentially.\n //\n // All browsers respect CSS specificity based on the order of the link\n // elements in the DOM, regardless of the order in which the stylesheets\n // are actually downloaded.\n if (isCSS || this.env.async || this.env.gecko || this.env.opera) {\n // Load in parallel.\n this.queue[type].push({\n urls: urls,\n callback: callback,\n obj: obj,\n context: context\n });\n } else {\n // Load sequentially.\n for (i = 0, len = urls.length; i < len; ++i) {\n this.queue[type].push({\n urls: [urls[i]],\n callback: i === len - 1 ? callback : null, // callback is only added to the last URL\n obj: obj,\n context: context\n });\n }\n }\n }\n\n // If a previous load request of this type is currently in progress, we'll\n // wait our turn. Otherwise, grab the next item in the queue.\n if (this.pending[type] || !(p = this.pending[type] = this.queue[type].shift())) {\n return;\n }\n\n\n pendingUrls = p.urls;\n\n for (i = 0, len = pendingUrls.length; i < len; ++i) {\n url = pendingUrls[i];\n\n if (isCSS) {\n node = this.env.gecko ? this.createNode('style') : this.createNode('link', {\n href: url,\n rel: 'stylesheet'\n });\n } else {\n node = this.createNode('script', { src: url });\n node.async = false;\n }\n\n node.className = 'lazyload';\n node.setAttribute('charset', 'utf-8');\n\n if (this.env.ie && !isCSS) {\n node.onreadystatechange = function() {\n if (/loaded|complete/.test(node.readyState)) {\n node.onreadystatechange = null;\n _finish();\n }\n };\n } else if (isCSS && (this.env.gecko || this.env.webkit)) {\n // Gecko and WebKit don't support the onload event on link nodes.\n if (this.env.webkit) {\n // In WebKit, we can poll for changes to document.styleSheets to\n // figure out when stylesheets have loaded.\n p.urls[i] = node.href; // resolve relative URLs (or polling won't work)\n this.pollWebKit();\n } else {\n // In Gecko, we can import the requested URL into a <style> node and\n // poll for the existence of node.sheet.cssRules. Props to Zach\n // Leatherman for calling my attention to this technique.\n node.innerHTML = '@import \"' + url + '\";';\n this.pollGecko(node);\n }\n } else {\n node.onload = node.onerror = _finish;\n }\n\n nodes.push(node);\n }\n\n for (i = 0, len = nodes.length; i < len; ++i) {\n this.head.appendChild(nodes[i]);\n }\n }\n\n /**\n Begins polling to determine when the specified stylesheet has finished loading\n in Gecko. Polling stops when all pending stylesheets have loaded or after 10\n seconds (to prevent stalls).\n\n Thanks to Zach Leatherman for calling my attention to the @import-based\n cross-domain technique used here, and to Oleg Slobodskoi for an earlier\n same-domain implementation. See Zach's blog for more details:\n http://www.zachleat.com/web/2010/07/29/load-css-dynamically/\n\n @method pollGecko\n @param {HTMLElement} node Style node to poll.\n @private\n */\n pollGecko(node) {\n var hasRules;\n\n try {\n // We don't really need to store this value or ever refer to it again, but\n // if we don't store it, Closure Compiler assumes the code is useless and\n // removes it.\n hasRules = !!node.sheet.cssRules;\n } catch (ex) {\n // An exception means the stylesheet is still loading.\n this.pollCount += 1;\n\n if (this.pollCount < 200) {\n var self = this;\n setTimeout(function() { self.pollGecko(node); }, 50);\n } else {\n // We've been polling for 10 seconds and nothing's happened. Stop\n // polling and finish the pending requests to avoid blocking further\n // requests.\n hasRules && this.finish('css');\n }\n\n return;\n }\n\n // If we get here, the stylesheet has loaded.\n this.finish('css');\n }\n\n /**\n Begins polling to determine when pending stylesheets have finished loading\n in WebKit. Polling stops when all pending stylesheets have loaded or after 10\n seconds (to prevent stalls).\n\n @method pollWebKit\n @private\n */\n pollWebKit() {\n var css = this.pending.css,\n i;\n\n if (css) {\n i = this.styleSheets.length;\n\n // Look for a stylesheet matching the pending URL.\n while (--i >= 0) {\n if (this.styleSheets[i].href === css.urls[0]) {\n this.finish('css');\n break;\n }\n }\n\n this.pollCount += 1;\n\n if (css) {\n if (this.pollCount < 200) {\n setTimeout(this.pollWebKit.bind(this), 50);\n } else {\n // We've been polling for 10 seconds and nothing's happened, which may\n // indicate that the stylesheet has been removed from the document\n // before it had a chance to load. Stop polling and finish the pending\n // request to prevent blocking further requests.\n this.finish('css');\n }\n }\n }\n }\n\n /**\n Requests the specified CSS URL or URLs and executes the specified\n callback (if any) when they have finished loading. If an array of URLs is\n specified, the stylesheets will be loaded in parallel and the callback\n will be executed after all stylesheets have finished loading.\n\n @method css\n @param {String|Array} urls CSS URL or array of CSS URLs to load\n @param {Function} callback (optional) callback function to execute when\n the specified stylesheets are loaded\n @param {Object} obj (optional) object to pass to the callback function\n @param {Object} context (optional) if provided, the callback function\n will be executed in this object's context\n @static\n */\n css(urls, callback, obj, context) {\n this.load('css', urls, callback, obj, context);\n }\n\n /**\n Requests the specified JavaScript URL or URLs and executes the specified\n callback (if any) when they have finished loading. If an array of URLs is\n specified and the browser supports it, the scripts will be loaded in\n parallel and the callback will be executed after all scripts have\n finished loading.\n\n Currently, only Firefox and Opera support parallel loading of scripts while\n preserving execution order. In other browsers, scripts will be\n queued and loaded one at a time to ensure correct execution order.\n\n @method js\n @param {String|Array} urls JS URL or array of JS URLs to load\n @param {Function} callback (optional) callback function to execute when\n the specified scripts are loaded\n @param {Object} obj (optional) object to pass to the callback function\n @param {Object} context (optional) if provided, the callback function\n will be executed in this object's context\n @static\n */\n js(urls, callback, obj, context) {\n this.load('js', urls, callback, obj, context);\n }\n}\n\nfunction loadJS(urls, callback, obj, context) {\n loader.js(urls, callback, obj, context)\n}\n\nfunction loadCSS(urls, callback, obj, context) {\n loader.css(urls, callback, obj, context)\n}\n\n\n// this seems fragile but not sure how else to inject the document\n// besides \nlet loader = new Loader(document)\n\nexport { loadJS, loadCSS }","import { trace, unique_ID, getUrlVars, ratio, parseYouTubeTime } from \"../../core/Util\"\nimport { loadJS } from \"../../core/Load\"\nimport { Media } from \"../Media\";\n\nexport default class YouTube extends Media {\n _loadMedia() {\n var self = this,\n url_vars;\n\n this.youtube_loaded = false;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-youtube tl-media-shadow\", this._el.content);\n this._el.content_item.id = unique_ID(7)\n\n // URL Vars\n url_vars = getUrlVars(this.data.url);\n\n // Get Media ID\n this.media_id = {};\n\n if (this.data.url.match('v=')) {\n this.media_id.id = url_vars[\"v\"];\n } else if (this.data.url.match('\\/embed\\/')) {\n this.media_id.id = this.data.url.split(\"embed\\/\")[1].split(/[?&]/)[0];\n } else if (this.data.url.match(/v\\/|v=|youtu\\.be\\//)) {\n this.media_id.id = this.data.url.split(/v\\/|v=|youtu\\.be\\//)[1].split(/[?&]/)[0];\n } else {\n trace(\"YOUTUBE IN URL BUT NOT A VALID VIDEO\");\n }\n\n // TODO: switch this to use parseYouTubeTime\n // Get start second\n if (this.data.url.match(\"start=\")) {\n this.media_id.start = parseYouTubeTime(this.data.url.split(\"start=\")[1], 10);\n } else if (this.data.url.match(\"t=\")) {\n this.media_id.start = parseYouTubeTime(this.data.url.split(\"t=\")[1], 10);\n }\n\n //Get end second\n if (this.data.url.match(\"end=\")) {\n this.media_id.end = parseYouTubeTime(this.data.url.split(\"end=\")[1], 10);\n }\n\n this.media_id.hd = Boolean(typeof(url_vars[\"hd\"]) != 'undefined');\n\n\n // API Call\n loadJS('https://www.youtube.com/iframe_api', function() {\n self.createMedia();\n });\n\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n //this.el.content_item = document.getElementById(this._el.content_item.id);\n this._el.content_item.style.height = ratio.r16_9({ w: this.options.width }) + \"px\";\n this._el.content_item.style.width = this.options.width + \"px\";\n }\n\n _stopMedia() {\n if (this.youtube_loaded) {\n try {\n if (this.player.getPlayerState() == YT.PlayerState.PLAYING) {\n this.player.pauseVideo();\n }\n } catch (err) {\n trace(err);\n }\n\n }\n }\n createMedia() {\n var self = this;\n\n clearTimeout(this.timer);\n\n if (typeof YT != 'undefined' && typeof YT.Player != 'undefined') {\n // Create Player\n this.player = new YT.Player(this._el.content_item.id, {\n playerVars: {\n enablejsapi: 1,\n color: 'white',\n controls: 1,\n start: this.media_id.start,\n end: this.media_id.end,\n fs: 1\n },\n videoId: this.media_id.id,\n events: {\n onReady: function() {\n self.onPlayerReady();\n // After Loaded\n self.onLoaded();\n },\n 'onStateChange': self.onStateChange\n }\n });\n } else {\n this.timer = setTimeout(function() {\n self.createMedia();\n }, 1000);\n }\n }\n\n /*\tEvents\n ================================================== */\n onPlayerReady(e) {\n this.youtube_loaded = true;\n this._el.content_item = document.getElementById(this._el.content_item.id);\n this.onMediaLoaded();\n\n }\n\n onStateChange(e) {\n if (e.data == YT.PlayerState.ENDED) {\n e.target.seekTo(0);\n e.target.pauseVideo();\n }\n }\n\n\n}","import { Media } from \"../Media\";\nimport { ratio, getParamString } from \"../../core/Util\"\n\n\nexport default class GoogleMap extends Media {\n\n /* Load the media\n ================================================== */\n _loadMedia() {\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-map tl-media-shadow\", this._el.content);\n\n // Get Media ID\n this.media_id = this.data.url;\n\n // API Call\n this.mapframe = this.domCreate(\"iframe\", \"\", this._el.content_item);\n this.mapframe.width = \"100%\";\n this.mapframe.height = \"100%\";\n this.mapframe.frameBorder = \"0\";\n this.mapframe.src = this.makeGoogleMapsEmbedURL(this.media_id, this.options.api_key_googlemaps);\n\n\n // After Loaded\n this.onLoaded();\n }\n\n _updateMediaDisplay() {\n if (this._state.loaded) {\n var dimensions = ratio.square({ w: this._el.content_item.offsetWidth });\n this._el.content_item.style.height = dimensions.h + \"px\";\n }\n }\n\n makeGoogleMapsEmbedURL(url, api_key) {\n // Test with https://docs.google.com/spreadsheets/d/1zCpvtRdftlR5fBPppmy_-SkGIo7RMwoPUiGFZDAXbTc/edit\n var Streetview = false;\n\n function determineMapMode(url) {\n function parseDisplayMode(display_mode, param_string) {\n // Set the zoom param\n if (display_mode.slice(-1) == \"z\") {\n param_string[\"zoom\"] = display_mode;\n // Set the maptype to something other than \"roadmap\"\n } else if (display_mode.slice(-1) == \"m\") {\n // TODO: make this somehow interpret the correct zoom level\n // until then fake it by using Google's default zoom level\n param_string[\"zoom\"] = 14;\n param_string[\"maptype\"] = \"satellite\";\n // Set all the fun streetview params\n } else if (display_mode.slice(-1) == \"t\") {\n Streetview = true;\n // streetview uses \"location\" instead of \"center\"\n // \"place\" mode doesn't have the center param, so we may need to grab that now\n if (mapmode == \"place\") {\n var center = url.match(regexes[\"place\"])[3] + \",\" + url.match(regexes[\"place\"])[4];\n } else {\n var center = param_string[\"center\"];\n delete param_string[\"center\"];\n }\n // Clear out all the other params -- this is so hacky\n param_string = {};\n param_string[\"location\"] = center;\n streetview_params = display_mode.split(\",\");\n for (let param in param_defs[\"streetview\"]) {\n var i = parseInt(param) + 1;\n if (param_defs[\"streetview\"][param] == \"pitch\" && streetview_params[i] == \"90t\") {\n // Although 90deg is the horizontal default in the URL, 0 is horizontal default for embed URL. WHY??\n // https://developers.google.com/maps/documentation/javascript/streetview\n param_string[param_defs[\"streetview\"][param]] = 0;\n } else {\n param_string[param_defs[\"streetview\"][param]] = streetview_params[i].slice(0, -1);\n }\n }\n\n }\n return param_string;\n }\n\n function determineMapModeURL(mapmode, match) {\n var param_string = {};\n var url_root = match[1],\n display_mode = match[match.length - 1];\n for (let param in param_defs[mapmode]) {\n // skip first 2 matches, because they reflect the URL and not params\n var i = parseInt(param) + 2;\n if (param_defs[mapmode][param] == \"center\") {\n param_string[param_defs[mapmode][param]] = match[i] + \",\" + match[++i];\n } else {\n param_string[param_defs[mapmode][param]] = match[i];\n }\n }\n\n param_string = parseDisplayMode(display_mode, param_string);\n param_string[\"key\"] = api_key;\n if (Streetview == true) {\n mapmode = \"streetview\";\n } else {}\n return (url_root + \"/embed/v1/\" + mapmode + getParamString(param_string));\n }\n\n\n let mapmode = \"view\";\n if (url.match(regexes[\"place\"])) {\n mapmode = \"place\";\n } else if (url.match(regexes[\"directions\"])) {\n mapmode = \"directions\";\n } else if (url.match(regexes[\"search\"])) {\n mapmode = \"search\";\n }\n return determineMapModeURL(mapmode, url.match(regexes[mapmode]));\n\n }\n\n // These must be in the order they appear in the original URL\n // \"key\" param not included since it's not in the URL structure\n // Streetview \"location\" param not included since it's captured as \"center\"\n // Place \"center\" param ...um...\n var param_defs = {\n \"view\": [\"center\"],\n \"place\": [\"q\", \"center\"],\n \"directions\": [\"origin\", \"destination\", \"center\"],\n \"search\": [\"q\", \"center\"],\n \"streetview\": [\"fov\", \"heading\", \"pitch\"]\n };\n // Set up regex parts to make updating these easier if Google changes them\n var root_url_regex = /(https:\\/\\/.+google.+?\\/maps)/;\n var coords_regex = /@([-\\d.]+),([-\\d.]+)/;\n var address_regex = /([\\w\\W]+)/;\n\n // Data doesn't seem to get used for anything\n var data_regex = /data=[\\S]*/;\n\n // Capture the parameters that determine what map tiles to use\n // In roadmap view, mode URLs include zoom paramater (e.g. \"14z\")\n // In satellite (or \"earth\") view, URLs include a distance parameter (e.g. \"84511m\")\n // In streetview, URLs include paramaters like \"3a,75y,49.76h,90t\" -- see http://stackoverflow.com/a/22988073\n var display_mode_regex = /,((?:[-\\d.]+[zmayht],?)*)/;\n\n var regexes = {\n view: new RegExp(root_url_regex.source + \"/\" + coords_regex.source + display_mode_regex.source),\n place: new RegExp(root_url_regex.source + \"/place/\" + address_regex.source + \"/\" + coords_regex.source + display_mode_regex.source),\n directions: new RegExp(root_url_regex.source + \"/dir/\" + address_regex.source + \"/\" + address_regex.source + \"/\" + coords_regex.source + display_mode_regex.source),\n search: new RegExp(root_url_regex.source + \"/search/\" + address_regex.source + \"/\" + coords_regex.source + display_mode_regex.source)\n };\n return determineMapMode(url);\n }\n\n}","import { Media } from \"../Media\";\nimport DOMPurify from 'dompurify';\n\nexport default class Blockquote extends Media {\n constructor(data, options, language) { //add_to_container) {\n super(data, options, language);\n this.blockquote = DOMPurify.sanitize(this.data.url)\n }\n _loadMedia() {\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-blockquote\", this._el.content);\n this._el.content_container.className = \"tl-media-content-container tl-media-content-container-text\";\n\n // API Call\n this._el.content_item.innerHTML = this.blockquote;\n\n // After Loaded\n this.onLoaded();\n }\n\n updateMediaDisplay() {\n // override DOM-oriented updates that don't apply to blockquotes\t\n }\n\n}","import { Media } from \"../Media\";\nimport { ajax } from \"../../net/Net\"\nimport { getObjectAttributeByIndex } from \"../../core/Util\"\n\nexport default class Wikipedia extends Media {\n\n _loadMedia() {\n var api_url,\n api_language,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-wikipedia\", this._el.content);\n this._el.content_container.className = \"tl-media-content-container tl-media-content-container-text\";\n\n // Get Media ID\n this.media_id = this.data.url.split(\"wiki\\/\")[1].split(\"#\")[0].replace(\"_\", \" \");\n this.media_id = this.media_id.replace(\" \", \"%20\");\n api_language = this.data.url.split(\"//\")[1].split(\".wikipedia\")[0];\n\n // API URL\n api_url = \"https://\" + api_language + \".wikipedia.org/w/api.php?action=query&prop=extracts|pageimages&redirects=&titles=\" + this.media_id + \"&exintro=1&format=json&callback=?\";\n\n // API Call\n ajax({\n type: 'GET',\n url: api_url,\n dataType: 'json', //json data type\n\n success: function(d) {\n self.createMedia(d);\n },\n error: function(xhr, type) {\n var error_text = \"\";\n error_text += self._(\"wikipedia_load_err\") + \"<br/>\" + self.media_id + \"<br/>\" + type;\n self.loadErrorDisplay(error_text);\n }\n });\n\n }\n\n createMedia(d) {\n var wiki = \"\";\n\n if (d.query) {\n var content = \"\",\n wiki = {\n entry: {},\n title: \"\",\n text: \"\",\n extract: \"\",\n paragraphs: 1,\n page_image: \"\",\n text_array: []\n };\n\n wiki.entry = getObjectAttributeByIndex(d.query.pages, 0);\n wiki.extract = wiki.entry.extract;\n wiki.title = wiki.entry.title;\n wiki.page_image = wiki.entry.thumbnail;\n\n if (wiki.extract.match(\"<p>\")) {\n wiki.text_array = wiki.extract.split(\"<p>\");\n } else {\n wiki.text_array.push(wiki.extract);\n }\n\n for (var i = 0; i < wiki.text_array.length; i++) {\n if (i + 1 <= wiki.paragraphs && i + 1 < wiki.text_array.length) {\n wiki.text += \"<p>\" + wiki.text_array[i + 1];\n }\n }\n\n\n content += \"<span class='tl-icon-wikipedia'></span>\";\n content += \"<div class='tl-wikipedia-title'><h4><a href='\" + this.data.url + \"' target='_blank' rel='noopener'>\" + wiki.title + \"</a></h4>\";\n content += \"<span class='tl-wikipedia-source'>\" + this._('wikipedia') + \"</span></div>\";\n\n if (wiki.page_image) {\n //content \t+= \t\"<img class='tl-wikipedia-pageimage' src='\" + wiki.page_image.source +\"'>\";\n }\n\n content += wiki.text;\n\n if (wiki.extract.match(\"REDIRECT\")) {\n\n } else {\n // Add to DOM\n this._el.content_item.innerHTML = content;\n // After Loaded\n this.onLoaded();\n }\n\n\n }\n\n }\n\n updateMediaDisplay() {\n\n }\n\n}","import { Media } from \"../Media\";\nimport { getJSON } from \"../../net/Net\";\nimport { loadJS } from \"../../core/Load\";\n\nexport default class SoundCloud extends Media {\n\t_loadMedia() {\n\t\tvar api_url,\n\t\t\tself = this;\n\n\t\t// Create Dom element\n\t\tthis._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-soundcloud tl-media-shadow\", this._el.content);\n\n\t\t// Get Media ID\n\t\tthis.media_id = this.data.url;\n\n\t\t// API URL\n\t\tapi_url = \"https://soundcloud.com/oembed?url=\" + this.media_id + \"&format=js&callback=?\"\n\n\t\t// API Call\n\t\tgetJSON(api_url, function(d) {\n\t\t\tloadJS(\"https://w.soundcloud.com/player/api.js\", function() {//load soundcloud api for pausing.\n\t\t\t\tself.createMedia(d);\n\t\t\t});\n\t\t});\n\n\t}\n\n\tcreateMedia(d) {\n\t\tthis._el.content_item.innerHTML = d.html;\n\n\t\tself.widget = SC.Widget(this._el.content_item.querySelector(\"iframe\"));//create widget for api use\n\t\tthis.soundCloudCreated = true;\n\n\n\t\t// After Loaded\n\t\tthis.onLoaded();\n\t}\n\n\t_stopMedia() {\n\t\tif (this.soundCloudCreated)\n\t\t{\n\t\t\tself.widget.pause();\n\t\t}\n\t}\n\n}\n","import { trace, ratio } from \"../../core/Util\"\nimport { Media } from \"../Media\";\n\nexport default class Vimeo extends Media {\n\n\t_loadMedia() {\n\t\tvar api_url,\n\t\t\tself = this;\n\n\t\t// Create Dom element\n\t\tthis._el.content_item\t= this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-vimeo tl-media-shadow\", this._el.content);\n\n\t\t// Get Media ID\n\t\tthis.media_id = this.data.url.split(/video\\/|\\/\\/vimeo\\.com\\//)[1].split(/[?&]/)[0];\n\t\tvar start_time = null;\n\n\t\t// Get start time\n\t\tif (this.data.url.match(/#t=([^&]+).*/)) {\n\t\t\tstart_time = this.data.url.match(/#t=([^&]+).*/)[1];\n\t\t}\n\n\t\t// API URL\n\t\tapi_url = \"https://player.vimeo.com/video/\" + this.media_id + \"?api=1&title=0&byline=0&portrait=0&color=ffffff\";\n\t\tif (start_time) {\n\t\t\tapi_url = api_url += '&#t=' + start_time;\n\t\t}\n\n\t\tthis.player = this.domCreate(\"iframe\", \"\", this._el.content_item);\n\n\t\t// Media Loaded Event\n\t\tthis.player.addEventListener('load', function(e) {\n\t\t\tself.onMediaLoaded();\n\t\t});\n\n\t\tthis.player.width \t\t= \"100%\";\n\t\tthis.player.height \t\t= \"100%\";\n\t\tthis.player.frameBorder = \"0\";\n\t\tthis.player.src \t\t= api_url;\n\n\t\tthis.player.setAttribute('allowfullscreen', '');\n\t\tthis.player.setAttribute('webkitallowfullscreen', '');\n\t\tthis.player.setAttribute('mozallowfullscreen', '');\n\n\t\t// After Loaded\n\t\tthis.onLoaded();\n\t}\n\n\t// Update Media Display\n\t_updateMediaDisplay() {\n\t\tthis._el.content_item.style.height = ratio.r16_9({w:this._el.content_item.offsetWidth}) + \"px\";\n\t}\n\n\t_stopMedia() {\n\n\t\ttry {\n\t\t\tthis.player.contentWindow.postMessage(JSON.stringify({method: \"pause\"}), \"https://player.vimeo.com\");\n\t\t}\n\t\tcatch(err) {\n\t\t\ttrace(err);\n\t\t}\n\t}\n}\n","import { Media } from \"../Media\";\nimport { ratio } from \"../../core/Util\"\n\nexport default class DailyMotion extends Media {\n _loadMedia() {\n var api_url,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-dailymotion\", this._el.content);\n\n // Get Media ID\n if (this.data.url.match(\"video\")) {\n this.media_id = this.data.url.split(\"video\\/\")[1].split(/[?&]/)[0];\n } else {\n this.media_id = this.data.url.split(\"embed\\/\")[1].split(/[?&]/)[0];\n }\n\n // API URL\n api_url = \"https://www.dailymotion.com/embed/video/\" + this.media_id + \"?api=postMessage\";\n\n // API Call\n this._el.content_item.innerHTML = \"<iframe autostart='false' frameborder='0' width='100%' height='100%' src='\" + api_url + \"'></iframe>\"\n\n // After Loaded\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n if (this._state.loaded) {\n this._el.content_item.style.height = ratio.r16_9({ w: this._el.content_item.offsetWidth }) + \"px\";\n }\n }\n\n _stopMedia() {\n if (this._state.loaded) {\n this._el.content_item.querySelector(\"iframe\").contentWindow.postMessage('{\"command\":\"pause\",\"parameters\":[]}', \"*\");\n }\n\n }\n\n}","import { Media } from \"../Media\";\nimport { ratio } from \"../../core/Util\"\n\nexport default class Vine extends Media {\n\n _loadMedia() {\n var api_url,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-vine tl-media-shadow\", this._el.content);\n\n // Get Media ID\n this.media_id = this.data.url.split(\"vine.co/v/\")[1];\n\n // API URL\n api_url = \"https://vine.co/v/\" + this.media_id + \"/embed/simple\";\n\n // API Call\n this._el.content_item.innerHTML = \"<iframe frameborder='0' width='100%' height='100%' src='\" + api_url + \"'></iframe><script async src='https://platform.vine.co/static/scripts/embed.js' charset='utf-8'></script>\"\n\n // After Loaded\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n var size = ratio.square({ w: this._el.content_item.offsetWidth, h: this.options.height });\n this._el.content_item.style.height = size.h + \"px\";\n }\n\n _stopMedia() {\n this._el.content_item.querySelector(\"iframe\").contentWindow.postMessage('pause', '*');\n }\n\n}","import { Media } from \"../Media\";\nimport { ajax } from \"../../net/Net\";\nimport { loadJS } from \"../../core/Load\";\n\nexport default class Twitter extends Media {\n _loadMedia() {\n var api_url,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-twitter\", this._el.content);\n this._el.content_container.className = \"tl-media-content-container tl-media-content-container-text\";\n\n // Get Media ID\n if (this.data.url.match(\"^(https?:)?\\/*(www.)?twitter\\.com\")) {\n if (this.data.url.match(\"status\\/\")) {\n this.media_id = this.data.url.split(\"status\\/\")[1];\n } else if (this.data.url.match(\"statuses\\/\")) {\n this.media_id = this.data.url.split(\"statuses\\/\")[1];\n } else {\n this.media_id = \"\";\n }\n } else if (this.data.url.match(\"<blockquote class=['\\\"]twitter-tweet['\\\"]\")) {\n\n var found = this.data.url.match(/(status|statuses)\\/(\\d+)/);\n if (found && found.length > 2) {\n this.media_id = found[2];\n } else {\n self.loadErrorDisplay(self._(\"twitterembed_invalidurl_err\"));\n return;\n }\n }\n\n // API URL\n api_url = \"https://api.twitter.com/1/statuses/oembed.json?id=\" + this.media_id + \"&omit_script=true&include_entities=true&callback=?\";\n\n // API Call\n ajax({\n type: 'GET',\n url: api_url,\n dataType: 'json', //json data type\n success: function(d) {\n self.createMedia(d);\n },\n error: function(xhr, type) {\n var error_text = \"\";\n error_text += self._(\"twitter_load_err\") + \"<br/>\" + self.media_id + \"<br/>\" + type;\n self.loadErrorDisplay(error_text);\n }\n });\n\n }\n\n createMedia(d) {\n var tweet = \"\",\n tweet_text = \"\",\n tweetuser = \"\",\n tweet_status_temp = \"\",\n tweet_status_url = \"\",\n tweet_status_date = \"\",\n self = this;\n\n //\tTWEET CONTENT\n tweet_text = d.html.split(\"<\\/p>\\—\")[0] + \"</p></blockquote>\";\n tweetuser = d.author_url.split(\"twitter.com\\/\")[1];\n tweet_status_temp = d.html.split(\"<\\/p>\\—\")[1].split(\"<a href=\\\"\")[1];\n tweet_status_url = tweet_status_temp.split(\"\\\"\\>\")[0];\n tweet_status_date = tweet_status_temp.split(\"\\\"\\>\")[1].split(\"<\\/a>\")[0];\n\n // Open links in new window\n tweet_text = tweet_text.replace(/<a href/ig, '<a target=\"_blank\" rel=\"noopener\" href');\n\n if (tweet_text.includes(\"pic.twitter.com\")) {\n\n loadJS('https://platform.twitter.com/widgets.js', function() {\n twttr.widgets.createTweet(self.media_id, self._el.content_item, {\n conversation: 'none', // or all\n linkColor: '#cc0000', // default is blue\n theme: 'light' // or dark\n })\n });\n\n this.onLoaded();\n\n } else {\n\n // \tTWEET CONTENT\n tweet += tweet_text;\n\n //\tTWEET AUTHOR\n tweet += \"<div class='vcard'>\";\n tweet += \"<a href='\" + tweet_status_url + \"' class='twitter-date' rel='noopener' target='_blank'>\" + tweet_status_date + \"</a>\";\n tweet += \"<img src='\" + \"' class='tl-media-item tl-media-image'>\" + \"</a>\";\n tweet += \"<div class='author'>\";\n tweet += \"<a class='screen-name url' href='\" + d.author_url + \"' rel='noopener' target='_blank'>\";\n tweet += \"<span class='avatar'></span>\";\n tweet += \"<span class='fn'>\" + d.author_name + \" <span class='tl-icon-twitter'></span></span>\";\n tweet += \"<span class='nickname'>@\" + tweetuser + \"<span class='thumbnail-inline'></span></span>\";\n tweet += \"</a>\";\n tweet += \"</div>\";\n tweet += \"</div>\";\n\n\n // Add to DOM\n this._el.content_item.innerHTML = tweet;\n\n // After Loaded\n this.onLoaded();\n }\n }\n\n\n updateMediaDisplay() {\n\n }\n\n _updateMediaDisplay() {\n\n }\n}","import { Media } from \"../Media\";\r\nimport { ajax } from \"../../net/Net\";\r\n\r\nexport default class TwitterEmbed extends Media {\r\n _loadMedia() {\r\n var api_url,\r\n self = this;\r\n\r\n // Create Dom element\r\n this._el.content_item = this.domCreate(\"div\", \"tl-media-twitter\", this._el.content);\r\n this._el.content_container.className = \"tl-media-content-container tl-media-content-container-text\";\r\n\r\n // Get Media ID\r\n var found = this.data.url.match(/(status|statuses)\\/(\\d+)/);\r\n if (found && found.length > 2) {\r\n this.media_id = found[2];\r\n } else {\r\n self.loadErrorDisplay(self._(\"twitterembed_invalidurl_err\"));\r\n return;\r\n }\r\n\r\n // API URL\r\n api_url = \"https://api.twitter.com/1/statuses/oembed.json?id=\" + this.media_id + \"&omit_script=true&include_entities=true&callback=?\";\r\n\r\n window.twttr = (function(d, s, id) {\r\n var js, fjs = d.getElementsByTagName(s)[0],\r\n t = window.twttr || {};\r\n if (d.getElementById(id)) return t;\r\n js = d.createElement(s);\r\n js.id = id;\r\n js.src = \"https://platform.twitter.com/widgets.js\";\r\n fjs.parentNode.insertBefore(js, fjs);\r\n\r\n t._e = [];\r\n t.ready = function(f) {\r\n t._e.push(f);\r\n };\r\n\r\n return t;\r\n }(document, \"script\", \"twitter-wjs\"));\r\n\r\n // API Call\r\n ajax({\r\n type: 'GET',\r\n url: api_url,\r\n dataType: 'json', //json data type\r\n success(d) {\r\n self.createMedia(d);\r\n },\r\n error: function(xhr, type) {\r\n var error_text = \"\";\r\n error_text += self._(\"twitter_load_err\") + \"<br/>\" + self.media_id + \"<br/>\" + type;\r\n self.loadErrorDisplay(error_text);\r\n }\r\n });\r\n\r\n }\r\n\r\n createMedia(d) {\r\n var tweet = \"\",\r\n tweet_text = \"\",\r\n tweetuser = \"\",\r\n tweet_status_temp = \"\",\r\n tweet_status_url = \"\",\r\n tweet_status_date = \"\";\r\n\r\n //\tTWEET CONTENT\r\n tweet_text = d.html.split(\"<\\/p>\\—\")[0] + \"</p></blockquote>\";\r\n tweetuser = d.author_url.split(\"twitter.com\\/\")[1];\r\n tweet_status_temp = d.html.split(\"<\\/p>\\—\")[1].split(\"<a href=\\\"\")[1];\r\n tweet_status_url = tweet_status_temp.split(\"\\\"\\>\")[0];\r\n tweet_status_date = tweet_status_temp.split(\"\\\"\\>\")[1].split(\"<\\/a>\")[0];\r\n\r\n // Open links in new window\r\n tweet_text = tweet_text.replace(/<a href/ig, '<a target=\"_blank\" rel=\"noopener\" href');\r\n let mediaID = this.media_id; // make visible in callback.\r\n if (tweet_text.includes(\"pic.twitter.com\")) {\r\n twttr.ready(\r\n function(evt) {\r\n tweet = document.getElementsByClassName(\"tl-media-twitter\")[0];\r\n var id = String(mediaID);\r\n twttr.widgets.createTweet(id, tweet, {\r\n conversation: 'none', // or all\r\n linkColor: '#cc0000', // default is blue\r\n theme: 'light' // or dark\r\n })\r\n .then(function(evt) {\r\n this.onLoaded();\r\n });\r\n }\r\n );\r\n this._el.content_item.innerHTML = tweet;\r\n this.onLoaded();\r\n } else {\r\n // \tTWEET CONTENT\r\n tweet += tweet_text;\r\n\r\n //\tTWEET AUTHOR\r\n tweet += \"<div class='vcard'>\";\r\n tweet += \"<a href='\" + tweet_status_url + \"' class='twitter-date' rel='noopener' target='_blank'>\" + tweet_status_date + \"</a>\";\r\n tweet += \"<div class='author'>\";\r\n tweet += \"<a class='screen-name url' href='\" + d.author_url + \"' rel='noopener' target='_blank'>\";\r\n tweet += \"<span class='avatar'></span>\";\r\n tweet += \"<span class='fn'>\" + d.author_name + \" <span class='tl-icon-twitter'></span></span>\";\r\n tweet += \"<span class='nickname'>@\" + tweetuser + \"<span class='thumbnail-inline'></span></span>\";\r\n tweet += \"</a>\";\r\n tweet += \"</div>\";\r\n tweet += \"</div>\";\r\n\r\n\r\n // Add to DOM\r\n this._el.content_item.innerHTML = tweet;\r\n\r\n // After Loaded\r\n this.onLoaded();\r\n }\r\n\r\n }\r\n\r\n updateMediaDisplay() {\r\n\r\n }\r\n\r\n _updateMediaDisplay() {\r\n\r\n }\r\n\r\n\r\n\r\n}","import { Media } from \"../Media\";\nimport { getJSON } from \"../../net/Net\";\nimport TLError from \"../../core/TLError\";\nimport { base58, unhtmlify } from \"../../core/Util\";\n\n\nexport default class Flickr extends Media {\n\n _loadMedia() {\n var api_url,\n self = this;\n\n try {\n // Get Media ID\n this.establishMediaID();\n\n // API URL\n api_url = \"https://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=\" + this.options.api_key_flickr + \"&photo_id=\" + this.media_id + \"&format=json&jsoncallback=?\";\n\n // API Call\n getJSON(api_url, function(d) {\n if (d.stat == \"ok\") {\n self.sizes = d.sizes.size; // store sizes info\n\n if (!self.options.background) {\n self.createMedia();\n }\n\n self.onLoaded();\n } else {\n self.loadErrorDisplay(self._(\"flickr_notfound_err\"));\n }\n });\n } catch (e) {\n self.loadErrorDisplay(self._(e.message_key));\n }\n }\n\n establishMediaID() {\n if (this.data.url.match(/flic.kr\\/.+/i)) {\n var encoded = this.data.url.split('/').slice(-1)[0];\n this.media_id = base58.decode(encoded);\n } else {\n var marker = 'flickr.com/photos/';\n var idx = this.data.url.indexOf(marker);\n if (idx == -1) { throw new TLError(\"flickr_invalidurl_err\"); }\n var pos = idx + marker.length;\n this.media_id = this.data.url.substr(pos).split(\"/\")[1];\n }\n }\n\n createMedia() {\n var self = this;\n\n // Link\n this._el.content_link = this.domCreate(\"a\", \"\", this._el.content);\n this._el.content_link.href = this.data.url;\n this._el.content_link.target = \"_blank\";\n this._el.content_link.setAttribute('rel', 'noopener');\n\n // Photo\n this._el.content_item = this.domCreate(\"img\", \"tl-media-item tl-media-image tl-media-flickr tl-media-shadow\", this._el.content_link);\n\n if (this.data.alt) {\n this._el.content_item.alt = this.data.alt;\n } else if (this.data.caption) {\n this._el.content_item.alt = unhtmlify(this.data.caption);\n }\n\n if (this.data.title) {\n this._el.content_item.title = this.data.title;\n } else if (this.data.caption) {\n this._el.content_item.title = unhtmlify(this.data.caption);\n }\n\n // Media Loaded Event\n this._el.content_item.addEventListener('load', function(e) {\n self.onMediaLoaded();\n });\n\n // Set Image Source\n this._el.content_item.src = this.getImageURL(this.options.width, this.options.height);\n }\n\n getImageURL(w, h) {\n var best_size = this.size_label(h),\n source = this.sizes[this.sizes.length - 2].source;\n\n for (var i = 0; i < this.sizes.length; i++) {\n if (this.sizes[i].label == best_size) {\n source = this.sizes[i].source;\n }\n }\n\n return source;\n }\n\n _getMeta() {\n var self = this,\n api_url;\n\n // API URL\n api_url = \"https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=\" + this.options.api_key_flickr + \"&photo_id=\" + this.media_id + \"&format=json&jsoncallback=?\";\n\n // API Call\n getJSON(api_url, function(d) {\n self.data.credit_alternate = \"<a href='\" + self.data.url + \"' target='_blank' rel='noopener'>\" + d.photo.owner.realname + \"</a>\";\n self.data.caption_alternate = d.photo.title._content + \" \" + d.photo.description._content;\n self.updateMeta();\n });\n }\n\n size_label(s) {\n var _size = \"\";\n\n if (s <= 75) {\n if (s <= 0) {\n _size = \"Large\";\n } else {\n _size = \"Thumbnail\";\n }\n } else if (s <= 180) {\n _size = \"Small\";\n } else if (s <= 240) {\n _size = \"Small 320\";\n } else if (s <= 375) {\n _size = \"Medium\";\n } else if (s <= 480) {\n _size = \"Medium 640\";\n } else if (s <= 600) {\n _size = \"Large\";\n } else {\n _size = \"Large\";\n }\n\n return _size;\n }\n\n}","import { trace, unique_ID } from \"../../core/Util\"\nimport { Media } from \"../Media\";\nimport { loadJS } from \"../../core/Load\";\n\nexport default class DocumentCloud extends Media {\n\n _loadMedia() {\n var self = this;\n\n // Create Dom elements\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-documentcloud tl-media-shadow\", this._el.content);\n this._el.content_item.id = unique_ID(7)\n\n // Check url\n if (this.data.url.match(/\\.html$/)) {\n this.data.url = this._transformURL(this.data.url);\n } else if (!(this.data.url.match(/.(json|js)$/))) {\n trace(\"DOCUMENT CLOUD IN URL BUT INVALID SUFFIX\");\n }\n\n // Load viewer API\n loadJS([\n 'https://assets.documentcloud.org/viewer/loader.js',\n 'https://assets.documentcloud.org/viewer/viewer.js'\n ],\n function() {\n self.createMedia();\n }\n );\n }\n\n // Viewer API needs js, not html\n _transformURL(url) {\n return url.replace(/(.*)\\.html$/, '$1.js')\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n this._el.content_item.style.height = this.options.height + \"px\";\n //this._el.content_item.style.width = this.options.width + \"px\";\n }\n\n createMedia() {\n // DocumentCloud API call\n // DV is defined by the JS load in _loadMedia\n DV.load(this.data.url, {\n container: '#' + this._el.content_item.id,\n showSidebar: false\n });\n this.onLoaded();\n }\n\n\n}","import { unhtmlify, trace } from \"../../core/Util\";\nimport { ajax, fetchJSON } from \"../../net/Net\";\nimport { Media } from \"../Media\";\n\nconst CLIENT_TOKEN = '830b21071290df4f81a35c56abbea096'\nconst FB_APP_ID = '704270473831239'\nconst ACCESS_TOKEN = `${FB_APP_ID}|${CLIENT_TOKEN}`\nconst API_URL_ROOT = `https://graph.facebook.com/v8.0/instagram_oembed?access_token=${ACCESS_TOKEN}&fields=html,thumbnail_url,author_name&url=`\n\n/**\n * Break out from AJAX call for clarity. Remember to .bind() a this value.\n * @param {XMLHttpResponse} resp \n */\nfunction successHandler(resp) {\n\n this.oembed_response = resp;\n\n // Link\n this._el.content_link = this.domCreate(\"a\", \"\", this._el.content);\n this._el.content_link.href = this.data.url;\n this._el.content_link.target = \"_blank\";\n this._el.content_link.setAttribute('rel', 'noopener');\n\n // Photo\n this._el.content_item = this.domCreate(\"img\", \"tl-media-item tl-media-image tl-media-instagram tl-media-shadow\", this._el.content_link);\n\n if (this.data.alt) {\n this._el.content_item.alt = this.data.alt;\n } else if (this.data.caption) {\n this._el.content_item.alt = unhtmlify(this.data.caption);\n }\n\n if (this.data.title) {\n this._el.content_item.title = this.data.title;\n } else if (this.data.caption) {\n this._el.content_item.title = unhtmlify(this.data.caption);\n }\n\n // Media Loaded Event\n this._el.content_item.addEventListener('load', function(e) {\n this.onMediaLoaded();\n }.bind(this));\n\n this._el.content_item.src = resp.thumbnail_url\n\n // After Loaded\n this.onLoaded();\n\n}\n\n/**\n * Break out from AJAX call for clarity. Remember to .bind() a this value.\n * @param {XMLHttpResponse} resp\n */\nfunction errorHandler(resp) {\n let msg = `${resp.statusText} [${resp.status}]`\n if (resp.status == 400) {\n msg = this._('instagram_bad_request')\n }\n this.loadErrorDisplay(msg)\n}\n\nexport default class Instagram extends Media {\n\n\n\n _loadMedia() {\n // Get Media ID\n this.media_id = this.data.url.split(\"\\/p\\/\")[1].split(\"/\")[0];\n\n if (!this.options.background) {\n this.createMedia();\n }\n\n }\n\n createMedia() {\n this.oembed_response = null;\n var self = this;\n\n let data_url = `${API_URL_ROOT}${this.data.url}`\n try {\n ajax({ // getJSON doesn't let us set an errorhandler :-(\n url: data_url,\n dataType: 'json',\n success: successHandler,\n error: errorHandler,\n context: this\n })\n } catch (e) {\n console.log(`Instagram: error fetching ${data_url}`)\n console.log(e)\n debugger;\n }\n\n\n }\n\n getImageURL() {\n if (this.oembed_response && this.oembed_response.thumbnail_url) {\n return this.oembed_response.thumbnail_url\n }\n\n fetchJSON(`${API_URL_ROOT}${this.data.url}`).then(json => {\n return json.thumbnail_url\n }).catch(err => {\n trace(`Instagram getImageURL Error: ${err.status} ${err.statusText}`)\n })\n }\n\n _getMeta() {\n if (this.oembed_response && this.oembed_response.author_name) {\n this.data.credit_alternate = `Instagram: <a href=\"https://instagram.com/${this.oembed_response.author_name}\" target=\"_blank\">@${this.oembed_response.author_name}</a>`\n }\n // nothing in our data helps us provide an alternative caption...\n // this.data.caption_alternate = d.title;\n this.updateMeta();\n }\n\n sizes(s) {\n var _size = \"\";\n if (s <= 150) {\n _size = \"t\";\n } else if (s <= 306) {\n _size = \"m\";\n } else {\n _size = \"l\";\n }\n\n return _size;\n }\n\n}","import * as Browser from \"../../core/Browser\"\nimport { Media } from \"../Media\";\n\nexport default class Profile extends Media {\n _loadMedia() {\n\n this._el.content_item = this.domCreate(\"img\", \"tl-media-item tl-media-image tl-media-profile tl-media-shadow\", this._el.content);\n this._el.content_item.src = this.data.url;\n\n this.onLoaded();\n }\n\n _updateMediaDisplay(layout) {\n if (Browser.firefox) {\n this._el.content_item.style.maxWidth = (this.options.width / 2) - 40 + \"px\";\n }\n }\n\n}","import { Media } from \"../Media\";\n\nexport default class GoogleDoc extends Media {\n\n /*\tLoad the media\n ================================================== */\n _loadMedia() {\n var url,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe\", this._el.content);\n\n // Get Media ID\n if (this.data.url.match(/open\\?id=([^&]+)/)) {\n var doc_id = this.data.url.match(/open\\?id=([^&]+)/)[1];\n url = 'https://drive.google.com/file/d/' + doc_id + '/preview'\n } else if (this.data.url.match(/file\\/d\\/([^/]*)\\/?/)) {\n var doc_id = this.data.url.match(/file\\/d\\/([^/]*)\\/?/)[1];\n url = 'https://drive.google.com/file/d/' + doc_id + '/preview'\n } else {\n url = this.data.url;\n }\n\n // this URL makes something suitable for an img src but what if it's not an image?\n // api_url = \"http://www.googledrive.com/host/\" + this.media_id + \"/\";\n\n this._el.content_item.innerHTML = \"<iframe class='doc' frameborder='0' width='100%' height='100%' src='\" + url + \"'></iframe>\";\n\n // After Loaded\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n this._el.content_item.style.height = this.options.height + \"px\";\n }\n\n\n}","import { trace } from \"../../core/Util\"\nimport { Media } from \"../Media\";\nimport * as Browser from \"../../core/Browser\"\n\nexport function computeMediaId(url) {\n\n var media_id = null;\n\n if (url.match(/^spotify:/)) return url; // trust all Spotify URIs will be embeddable\n\n url = new URL(url)\n\n // again, we're kind of trusting here, but especially that the embed service will reject wrong cases.\n let path = url.pathname.replace(/\\/$/, '') // strip trailing slash if there is one\n return `spotify${path.replace(/\\//g,':')}`\n}\n\nexport default class Spotify extends Media {\n _loadMedia() {\n\n var api_url;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-spotify\", this._el.content);\n\n\n this.media_id = computeMediaId(this.data.url)\n\n if (this.media_id) {\n // API URL\n api_url = \"https://embed.spotify.com/?uri=\" + this.media_id + \"&theme=white&view=coverart\";\n\n this.player = this.domCreate(\"iframe\", \"tl-media-shadow\", this._el.content_item);\n this.player.width = \"100%\";\n this.player.height = \"100%\";\n this.player.frameBorder = \"0\";\n this.player.src = api_url;\n\n // After Loaded\n this.onLoaded();\n\n } else {\n this.loadErrorDisplay(this._('spotify_invalid_url'));\n }\n }\n\n // Update Media Display\n\n _updateMediaDisplay(l) {\n var _height = this.options.height,\n _player_height = 0,\n _player_width = 0;\n\n if (Browser.mobile) {\n _height = (this.options.height / 2);\n } else {\n _height = this.options.height - this.options.credit_height - this.options.caption_height - 30;\n }\n\n this._el.content_item.style.maxHeight = \"none\";\n trace(_height);\n trace(this.options.width)\n if (_height > this.options.width) {\n trace(\"height is greater\")\n _player_height = this.options.width + 80 + \"px\";\n _player_width = this.options.width + \"px\";\n } else {\n trace(\"width is greater\")\n trace(this.options.width)\n _player_height = _height + \"px\";\n _player_width = _height - 80 + \"px\";\n }\n\n\n this.player.style.width = _player_width;\n this.player.style.height = _player_height;\n\n if (this._el.credit) {\n this._el.credit.style.width = _player_width;\n }\n if (this._el.caption) {\n this._el.caption.style.width = _player_width;\n }\n }\n\n\n _stopMedia() {\n // Need spotify stop code\n\n }\n\n}","import { Media } from \"../Media\";\nimport DOMPurify from 'dompurify';\n\nexport default class IFrame extends Media {\n constructor(data, options, language) { //add_to_container) {\n super(data, options, language);\n this.iframe = DOMPurify.sanitize(this.data.url, {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['frameborder'],\n })\n }\n\n _loadMedia() {\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe\", this._el.content);\n\n // API Call\n this._el.content_item.innerHTML = this.iframe;\n\n // After Loaded\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n this._el.content_item.style.height = this.options.height + \"px\";\n }\n\n}","import { Media } from \"../Media\";\nimport { loadJS } from \"../../core/Load\";\nimport { ajax } from \"../../net/Net\";\nimport { ratio, trace } from \"../../core/Util\";\nimport TLError from \"../../core/TLError\";\n\nexport default class Imgur extends Media {\n\n _loadMedia() {\n try {\n var self = this;\n\n if (this.data.url.match(\"<blockquote class=['\\\"]imgur-embed-pub['\\\"]\")) {\n var found = this.data.url.match(/(imgur\\.com)\\/(\\w+)/);\n this.media_id = found[2];\n this.data.url = \"http://imgur.com/gallery/\" + this.media_id;\n } else if (this.data.url) {\n this.media_id = this.data.url.split('/').slice(-1)[0];\n }\n\n loadJS([\n 'https://s.imgur.com/min/embed.js'\n ],\n function() {\n self.createMedia();\n }\n );\n\n } catch (e) {\n this.loadErrorDisplay(this._(\"imgur_invalidurl_err\"));\n }\n }\n\n createMedia() {\n var self = this;\n var api_url = \"https://api.imgur.com/oembed.json?url=\" + this.data.url;\n\n // Content div\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-image tl-media-imgur\",\n this._el.content);\n\n // API Call\n\n ajax({\n type: 'GET',\n url: api_url,\n dataType: 'json',\n success: function(data) {\n try {\n self._el.content_item.innerHTML = data.html;\n setInterval(function() {\n if (document.querySelector(\"blockquote.imgur-embed-pub\") == null) {\n clearInterval();\n } else {\n imgurEmbed.createIframe();\n document.getElementById(\"imageElement\").removeAttribute(\"style\");\n document.getElementById(\"image\").removeAttribute(\"style\");\n }\n }, 2000);\n } catch (e) {\n trace(\"Error processing imgur ajax response\", e)\n }\n },\n error: function(xhr, errorType, error) {\n if (errorType == 'parsererror') {\n self.loadErrorDisplay(self._(\"imgur_invalidurl_err\"));\n } else {\n self.loadErrorDisplay(self._(\"unknown_read_err\", errorType));\n }\n }\n });\n this.onLoaded();\n\n }\n\n _updateMediaDisplay() {\n //this.el.content_item = document.getElementById(this._el.content_item.id);\n this._el.content_item.style.width = this.options.width + \"px\";\n this._el.content_item.style.height = ratio.r16_9({ w: this.options.width }) + \"px\";\n }\n\n}","import { Media } from \"../Media\";\nimport { transformMediaURL } from \"../../core/Util\";\nimport * as Browser from \"../../core/Browser\"\n\nexport default class PDF extends Media {\n\n _loadMedia() {\n var url = transformMediaURL(this.data.url),\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe\", this._el.content);\n var markup = \"\";\n // not assigning media_id attribute. Seems like a holdover which is no longer used.\n if (Browser.ie || Browser.edge || url.match(/dl.dropboxusercontent.com/)) {\n markup = \"<iframe class='doc' frameborder='0' width='100%' height='100%' src='//docs.google.com/viewer?url=\" + url + \"&embedded=true'></iframe>\";\n } else {\n markup = \"<iframe class='doc' frameborder='0' width='100%' height='100%' src='\" + url + \"'></iframe>\"\n }\n this._el.content_item.innerHTML = markup\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n this._el.content_item.style.height = this.options.height + \"px\";\n }\n\n\n}","import { Media } from \"../Media\";\nimport { transformMediaURL } from \"../../core/Util\";\nimport * as Browser from \"../../core/Browser\"\nimport { trace } from \"../../core/Util\";\n\nexport default class Audio extends Media {\n _loadMedia() {\n // Loading Message\n this.loadingMessage();\n\n // Create media?\n if (!this.options.background) {\n this.createMedia();\n }\n\n // After loaded\n this.onLoaded();\n }\n\n createMedia() {\n //Transform URL for Dropbox\n var url = transformMediaURL(this.data.url),\n self = this;\n\n var self = this,\n audio_class = \"tl-media-item tl-media-audio tl-media-shadow\";\n\n this._el.content_item = this.domCreate(\"audio\", audio_class, this._el.content);\n\n this._el.content_item.controls = true;\n this._el.source_item = this.domCreate(\"source\", \"\", this._el.content_item);\n\n // Media Loaded Event\n this._el.content_item.addEventListener('load', function(e) {\n self.onMediaLoaded();\n });\n\n this._el.source_item.src = url;\n this._el.source_item.type = this._getType(this.data.url, this.data.mediatype.match_str);\n this._el.content_item.innerHTML += \"Your browser doesn't support HTML5 audio with \" + this._el.source_item.type;\n this.player_element = this._el.content_item\n }\n\n _updateMediaDisplay(layout) {\n if (Browser.firefox) {\n this._el.content_item.style.width = \"auto\";\n }\n }\n\n _stopMedia() {\n if (this.player_element) {\n this.player_element.pause()\n }\n }\n\n\n _getType(url, reg) {\n var ext = url.match(reg);\n var type = \"audio/\"\n switch (ext[1]) {\n case \"mp3\":\n type += \"mpeg\";\n break;\n case \"wav\":\n type += \"wav\";\n break;\n case \"m4a\":\n type += \"mp4\";\n break;\n default:\n type = \"audio\";\n break;\n }\n return type\n }\n\n}","import { Media } from \"../Media\";\nimport * as Browser from \"../../core/Browser\"\nimport { transformMediaURL } from \"../../core/Util\";\n\nexport default class Video extends Media {\n _loadMedia() {\n // Loading Message\n this.loadingMessage();\n\n // Create media?\n if (!this.options.background) {\n this.createMedia();\n }\n\n // After loaded\n this.onLoaded();\n }\n\n createMedia() {\n //Transform URL for Dropbox\n var url = transformMediaURL(this.data.url),\n self = this;\n\n var self = this,\n video_class = \"tl-media-item tl-media-video tl-media-shadow\";\n\n // Link\n this._el.content_item = this.domCreate(\"video\", video_class, this._el.content);\n\n this._el.content_item.controls = true;\n this._el.source_item = this.domCreate(\"source\", \"\", this._el.content_item);\n\n // Media Loaded Event\n this._el.content_item.addEventListener('load', function(e) {\n self.onMediaLoaded();\n });\n\n this._el.source_item.src = url;\n this._el.source_item.type = this._getType(this.data.url, this.data.mediatype.match_str);\n this._el.content_item.innerHTML += \"Your browser doesn't support HTML5 video with \" + this._el.source_item.type;\n this.player_element = this._el.content_item\n\n }\n\n _updateMediaDisplay(layout) {\n if (Browser.firefox) {\n this._el.content_item.style.width = \"auto\";\n }\n }\n\n _stopMedia() {\n if (this.player_element) {\n this.player_element.pause()\n }\n }\n\n _getType(url, reg) {\n var ext = url.match(reg);\n var type = \"video/\"\n switch (ext[1]) {\n case \"mp4\":\n type += \"mp4\";\n break;\n case \"webm\":\n type += \"webm\";\n break;\n default:\n type = \"video\";\n break;\n }\n return type\n }\n\n}","import { Media } from \"../Media\";\nimport { ratio, trace } from \"../../core/Util\";\n\nexport default class Wistia extends Media {\n\n _loadMedia() {\n var api_url,\n self = this;\n\n // Create Dom element\n this._el.content_item = this.domCreate(\"div\", \"tl-media-item tl-media-iframe tl-media-wistia tl-media-shadow\", this._el.content);\n\n // Get Media ID\n this.media_id = this.data.url.split(/https?:\\/\\/(.+)?(wistia\\.com|wi\\.st)\\/medias\\/(.*)/)[3];\n trace(`Wistia: media_id: ${this.media_id}`)\n // API URL\n api_url = \"https://fast.wistia.com/embed/iframe/\" + this.media_id + \"?version=v1&controlsVisibleOnLoad=true&playerColor=aae3d8\";\n\n this.player = this.domCreate(\"iframe\", \"\", this._el.content_item);\n\n // Media Loaded Event\n this.player.addEventListener('load', function(e) {\n self.onMediaLoaded();\n });\n\n this.player.width = \"100%\";\n this.player.height = \"100%\";\n this.player.frameBorder = \"0\";\n this.player.src = api_url;\n\n this.player.setAttribute('allowfullscreen', '');\n this.player.setAttribute('webkitallowfullscreen', '');\n this.player.setAttribute('mozallowfullscreen', '');\n\n // After Loaded\n this.onLoaded();\n }\n\n // Update Media Display\n _updateMediaDisplay() {\n this._el.content_item.style.height = ratio.r16_9({ w: this._el.content_item.offsetWidth }) + \"px\";\n }\n\n _stopMedia() {\n try {\n this.player.contentWindow.postMessage(JSON.stringify({ method: \"pause\" }), \"https://player.vimeo.com\");\n } catch (err) {\n trace(err);\n }\n }\n}","/*\n Determines the type of media the url string is.\n returns an object with .type and .id\n You can add new media types by adding a regex\n to match and the media class name to use to\n render the media\n\n The image_only parameter indicates that the\n call only wants an image-based media type\n that can be resolved to an image URL.\n================================================== */\n\nimport Image from \"./types/Image\"\nimport YouTube from \"./types/YouTube\"\nimport GoogleMap from \"./types/GoogleMap\"\nimport Blockquote from \"./types/Blockquote\"\nimport Wikipedia from \"./types/Wikipedia\"\nimport SoundCloud from \"./types/SoundCloud\"\nimport Vimeo from \"./types/Vimeo\"\nimport DailyMotion from \"./types/DailyMotion\"\nimport Vine from \"./types/Vine\"\nimport Twitter from \"./types/Twitter\"\nimport TwitterEmbed from \"./types/TwitterEmbed\"\nimport Flickr from \"./types/Flickr\"\nimport DocumentCloud from \"./types/DocumentCloud\"\nimport Instagram from \"./types/Instagram\"\nimport Profile from \"./types/Profile\"\nimport GoogleDoc from \"./types/GoogleDoc\"\nimport Spotify from \"./types/Spotify\"\nimport IFrame from \"./types/IFrame\"\nimport Imgur from \"./types/Imgur\"\nimport PDF from \"./types/PDF\"\nimport Audio from \"./types/Audio\"\nimport Video from \"./types/Video\"\nimport Wistia from \"./types/Wistia\"\n\n/**\n * Given a JavaScript Object for an event from a TimelineConfig,\n * determine the appropriate subclass of Media which can handle creating and showing an \n * embed in the \"media\" section of that event's slide.\n *\n * When the `image_only` argument is true, the input `url_or_text` will only be\n * tested against patterns which are known to return images suitable for use as\n * thumbnails and backgrounds. Media classes returned when image_only is true should \n * implement the getImageURL() function\n *\n * @param {Object} m\n * @param {Boolean} image_only\n * \n * @returns {Object} a JS object which represents the match, including a `type`, `name`, \n * `match_str`, and `cls`. These are all string values, except `cls`, which\n * is a JavaScript class which can be used to instantiate a media embed\n * or thumbnail.\n */\n\nexport function lookupMediaType(m, image_only) {\n var media = {},\n media_types = [{\n type: \"youtube\",\n name: \"YouTube\",\n match_str: \"^(https?:)?\\/*(www.)?youtube|youtu\\.be\",\n cls: YouTube\n },\n {\n type: \"vimeo\",\n name: \"Vimeo\",\n match_str: \"^(https?:)?\\/*(player.)?vimeo\\.com\",\n cls: Vimeo\n },\n {\n type: \"dailymotion\",\n name: \"DailyMotion\",\n match_str: \"^(https?:)?\\/*(www.)?dailymotion\\.com\",\n cls: DailyMotion\n },\n {\n type: \"vine\",\n name: \"Vine\",\n match_str: \"^(https?:)?\\/*(www.)?vine\\.co\",\n cls: Vine\n },\n {\n type: \"soundcloud\",\n name: \"SoundCloud\",\n match_str: \"^(https?:)?\\/*(player.)?soundcloud\\.com\",\n cls: SoundCloud\n },\n {\n type: \"twitter\",\n name: \"Twitter\",\n match_str: \"^(https?:)?\\/*(www.)?twitter\\.com\",\n cls: Twitter\n },\n {\n type: \"twitterembed\",\n name: \"TwitterEmbed\",\n match_str: \"<blockquote class=['\\\"]twitter-tweet['\\\"]\",\n cls: TwitterEmbed\n },\n {\n type: \"googlemaps\",\n name: \"Google Map\",\n match_str: /google.+?\\/maps\\/@([-\\d.]+),([-\\d.]+),((?:[-\\d.]+[zmayht],?)*)|google.+?\\/maps\\/search\\/([\\w\\W]+)\\/@([-\\d.]+),([-\\d.]+),((?:[-\\d.]+[zmayht],?)*)|google.+?\\/maps\\/place\\/([\\w\\W]+)\\/@([-\\d.]+),([-\\d.]+),((?:[-\\d.]+[zmayht],?)*)|google.+?\\/maps\\/dir\\/([\\w\\W]+)\\/([\\w\\W]+)\\/@([-\\d.]+),([-\\d.]+),((?:[-\\d.]+[zmayht],?)*)/,\n cls: GoogleMap\n },\n {\n type: \"flickr\",\n name: \"Flickr\",\n match_str: \"^(https?:)?\\/*(www.)?flickr.com\\/photos\",\n cls: Flickr\n },\n {\n type: \"flickr\",\n name: \"Flickr\",\n match_str: \"^(https?:\\/\\/)?flic.kr\\/.*\",\n cls: Flickr\n },\n {\n type: \"instagram\",\n name: \"Instagram\",\n match_str: /^(https?:)?\\/*(www.)?(instagr.am|^(https?:)?\\/*(www.)?instagram.com)\\/p\\//,\n cls: Instagram\n },\n {\n type: \"profile\",\n name: \"Profile\",\n match_str: /^(https?:)?\\/*(www.)?instagr.am\\/[a-zA-Z0-9]{2,}|^(https?:)?\\/*(www.)?instagram.com\\/[a-zA-Z0-9]{2,}/,\n cls: Profile\n },\n {\n type: \"documentcloud\",\n name: \"Document Cloud\",\n match_str: /documentcloud.org\\//,\n cls: DocumentCloud\n },\n {\n type: \"image\",\n name: \"Image\",\n match_str: /(jpg|jpeg|png|gif|svg|webp)(\\?.*)?$/i,\n cls: Image\n },\n {\n type: \"imgur\",\n name: \"Imgur\",\n match_str: /^.*imgur.com\\/.+$|<blockquote class=['\\\"]imgur-embed-pub['\\\"]/i,\n cls: Imgur\n },\n {\n type: \"googledocs\",\n name: \"Google Doc\",\n match_str: \"^(https?:)?\\/*[^.]*.google.com\\/[^\\/]*\\/d\\/[^\\/]*\\/[^\\/]*\\?usp=sharing|^(https?:)?\\/*drive.google.com\\/open\\?id=[^\\&]*\\&authuser=0|^(https?:)?\\/\\/*drive.google.com\\/open\\\\?id=[^\\&]*|^(https?:)?\\/*[^.]*.googledrive.com\\/host\\/[^\\/]*\\/\",\n cls: GoogleDoc\n },\n {\n type: \"pdf\",\n name: \"PDF\",\n match_str: /^.*\\.pdf(\\?.*)?(\\#.*)?/,\n cls: PDF\n },\n {\n type: \"wikipedia\",\n name: \"Wikipedia\",\n match_str: \"^(https?:)?\\/*(www.)?wikipedia\\.org|^(https?:)?\\/*([a-z][a-z].)?wikipedia\\.org\",\n cls: Wikipedia\n },\n {\n type: \"spotify\",\n name: \"spotify\",\n match_str: \"spotify\",\n cls: Spotify\n },\n {\n type: \"iframe\",\n name: \"iFrame\",\n match_str: \"iframe\",\n cls: IFrame\n },\n {\n type: \"blockquote\",\n name: \"Quote\",\n match_str: \"blockquote\",\n cls: Blockquote\n },\n {\n type: \"video\",\n name: \"Video\",\n match_str: /(mp4|webm)(\\?.*)?$/i,\n cls: Video\n },\n {\n type: \"wistia\",\n name: \"Wistia\",\n match_str: /https?:\\/\\/(.+)?(wistia\\.com|wi\\.st)\\/.*/i,\n cls: Wistia\n },\n {\n type: \"audio\",\n name: \"Audio\",\n match_str: /(mp3|wav|m4a)(\\?.*)?$/i,\n cls: Audio\n },\n {\n type: \"imageblank\",\n name: \"Imageblank\",\n match_str: \"\",\n cls: Image\n }\n ]\n\n if (image_only) {\n if (m instanceof Array) {\n return false;\n }\n for (var i = 0; i < media_types.length; i++) {\n switch (media_types[i].type) {\n case \"flickr\":\n case \"image\":\n case \"instagram\":\n if (m.url.match(media_types[i].match_str)) {\n media = media_types[i];\n return media;\n }\n break;\n default:\n break;\n }\n }\n\n } else {\n for (var i = 0; i < media_types.length; i++) {\n if (m.url.match(media_types[i].match_str)) {\n return media_types[i];\n }\n }\n }\n return false;\n}","import { classMixin, mergeData, unlinkify } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\n\nimport { addClass, removeClass } from \"../dom/DOMUtil\"\nimport * as DOM from \"../dom/DOM\"\nimport { webkit as BROWSER_WEBKIT } from \"../core/Browser\";\nimport { easeInSpline } from \"../animation/Ease\";\n\nimport { lookupMediaType } from \"../media/MediaType\"\n\nexport class TimeMarker {\n\tconstructor(data, options) {\n\n\t\t// DOM Elements\n\t\tthis._el = {\n\t\t\tcontainer: {},\n\t\t\tcontent_container: {},\n\t\t\tmedia_container: {},\n\t\t\ttimespan: {},\n\t\t\tline_left: {},\n\t\t\tline_right: {},\n\t\t\tcontent: {},\n\t\t\ttext: {},\n\t\t\tmedia: {},\n\t\t};\n\n\t\t// Components\n\t\tthis._text = {};\n\n\t\t// State\n\t\tthis._state = {\n\t\t\tloaded: false\n\t\t};\n\n\n\t\t// Data\n\t\tthis.data = {\n\t\t\tunique_id: \"\",\n\t\t\tbackground: null,\n\t\t\tdate: {\n\t\t\t\tyear: 0,\n\t\t\t\tmonth: 0,\n\t\t\t\tday: 0,\n\t\t\t\thour: 0,\n\t\t\t\tminute: 0,\n\t\t\t\tsecond: 0,\n\t\t\t\tmillisecond: 0,\n\t\t\t\tthumbnail: \"\",\n\t\t\t\tformat: \"\"\n\t\t\t},\n\t\t\ttext: {\n\t\t\t\theadline: \"\",\n\t\t\t\ttext: \"\"\n\t\t\t},\n\t\t\tmedia: null\n\t\t};\n\n\t\t// Options\n\t\tthis.options = {\n\t\t\tduration: 1000,\n\t\t\tease: easeInSpline,\n\t\t\twidth: 600,\n\t\t\theight: 600,\n\t\t\tmarker_width_min: 100 \t\t\t// Minimum Marker Width\n\t\t};\n\n\t\t// Actively Displaying\n\t\tthis.active = false;\n\n\t\t// Animation Object\n\t\tthis.animator = {};\n\n\t\t// End date\n\t\tthis.has_end_date = false;\n\n\t\t// Merge Data and Options\n\t\tmergeData(this.options, options);\n\t\tmergeData(this.data, data);\n\n\t\tthis._initLayout();\n\t\tthis._initEvents();\n\n\n\t}\n\n\t/*\tAdding, Hiding, Showing etc\n\t================================================== */\n\tshow() {\n\n\t}\n\n\thide() {\n\n\t}\n\n\tsetActive(is_active) {\n\t\tthis.active = is_active;\n\n\t\tif (this.active && this.has_end_date) {\n\t\t\tthis._el.container.className = 'tl-timemarker tl-timemarker-with-end tl-timemarker-active';\n\t\t} else if (this.active) {\n\t\t\tthis._el.container.className = 'tl-timemarker tl-timemarker-active';\n\t\t} else if (this.has_end_date) {\n\t\t\tthis._el.container.className = 'tl-timemarker tl-timemarker-with-end';\n\t\t} else {\n\t\t\tthis._el.container.className = 'tl-timemarker';\n\t\t}\n\t}\n\n\taddTo(container) {\n\t\tcontainer.appendChild(this._el.container);\n\t}\n\n\tremoveFrom(container) {\n\t\tcontainer.removeChild(this._el.container);\n\t}\n\n\tupdateDisplay(w, h) {\n\t\tthis._updateDisplay(w, h);\n\t}\n\n\tloadMedia() {\n\n\t\tif (this._media && !this._state.loaded) {\n\t\t\tthis._media.loadMedia();\n\t\t\tthis._state.loaded = true;\n\t\t}\n\t}\n\n\tstopMedia() {\n\t\tif (this._media && this._state.loaded) {\n\t\t\tthis._media.stopMedia();\n\t\t}\n\t}\n\n\tgetLeft() {\n\t\treturn this._el.container.style.left.slice(0, -2);\n\t}\n\n\tgetTime() {\n\t\treturn this.data.start_date.getTime();\n\t}\n\n\tgetEndTime() {\n\n\t\tif (this.data.end_date) {\n\t\t\treturn this.data.end_date.getTime();\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tsetHeight(h) {\n\t\tvar text_line_height = 12,\n\t\t\ttext_lines = 1;\n\n\t\tthis._el.content_container.style.height = h + \"px\";\n\t\tthis._el.timespan_content.style.height = h + \"px\";\n\t\t// Handle Line height for better display of text\n\t\tif (h <= 30) {\n\t\t\tthis._el.content.className = \"tl-timemarker-content tl-timemarker-content-small\";\n\t\t} else {\n\t\t\tthis._el.content.className = \"tl-timemarker-content\";\n\t\t}\n\n\t\tif (h <= 56) {\n\t\t\taddClass(this._el.content_container, \"tl-timemarker-content-container-small\");\n\t\t} else {\n\t\t\tremoveClass(this._el.content_container, \"tl-timemarker-content-container-small\");\n\t\t}\n\n\t\t// Handle number of lines visible vertically\n\n\t\tif (BROWSER_WEBKIT) {\n\t\t\ttext_lines = Math.floor(h / (text_line_height + 2));\n\t\t\tif (text_lines < 1) {\n\t\t\t\ttext_lines = 1;\n\t\t\t}\n\t\t\tthis._text.className = \"tl-headline\";\n\t\t\tthis._text.style.webkitLineClamp = text_lines;\n\t\t} else {\n\t\t\ttext_lines = h / text_line_height;\n\t\t\tif (text_lines > 1) {\n\t\t\t\tthis._text.className = \"tl-headline tl-headline-fadeout\";\n\t\t\t} else {\n\t\t\t\tthis._text.className = \"tl-headline\";\n\t\t\t}\n\t\t\tthis._text.style.height = (text_lines * text_line_height) + \"px\";\n\t\t}\n\n\t}\n\n\tsetWidth(w) {\n\t\tif (this.data.end_date) {\n\t\t\tthis._el.container.style.width = w + \"px\";\n\n\t\t\tif (w > this.options.marker_width_min) {\n\t\t\t\tthis._el.content_container.style.width = w + \"px\";\n\t\t\t\tthis._el.content_container.className = \"tl-timemarker-content-container tl-timemarker-content-container-long\";\n\t\t\t} else {\n\t\t\t\tthis._el.content_container.style.width = this.options.marker_width_min + \"px\";\n\t\t\t\tthis._el.content_container.className = \"tl-timemarker-content-container\";\n\t\t\t}\n\t\t}\n\n\t}\n\n\tsetClass(n) {\n\t\tthis._el.container.className = n;\n\t}\n\n\tsetRowPosition(n, remainder) {\n\t\tthis.setPosition({ top: n });\n\t\tthis._el.timespan.style.height = remainder + \"px\";\n\t}\n\n\t/*\tEvents\n\t================================================== */\n\t_onMarkerClick(e) {\n\t\tthis.fire(\"markerclick\", { unique_id: this.data.unique_id });\n\t}\n\n\t/*\tPrivate Methods\n\t================================================== */\n\t_initLayout() {\n\t\t// Create Layout\n\t\tthis._el.container = DOM.create(\"div\", \"tl-timemarker\");\n\t\tif (this.data.unique_id) {\n\t\t\tthis._el.container.id = this.data.unique_id + \"-marker\";\n\t\t}\n\n\t\tif (this.data.end_date) {\n\t\t\tthis.has_end_date = true;\n\t\t\tthis._el.container.className = 'tl-timemarker tl-timemarker-with-end';\n\t\t}\n\n\t\tthis._el.timespan = DOM.create(\"div\", \"tl-timemarker-timespan\", this._el.container);\n\t\tthis._el.timespan_content = DOM.create(\"div\", \"tl-timemarker-timespan-content\", this._el.timespan);\n\t\tthis._el.content_container = DOM.create(\"div\", \"tl-timemarker-content-container\", this._el.container);\n\n\t\tthis._el.content = DOM.create(\"div\", \"tl-timemarker-content\", this._el.content_container);\n\n\t\tthis._el.line_left = DOM.create(\"div\", \"tl-timemarker-line-left\", this._el.timespan);\n\t\tthis._el.line_right = DOM.create(\"div\", \"tl-timemarker-line-right\", this._el.timespan);\n\n\t\t// Thumbnail or Icon\n\t\tif (this.data.media) {\n\t\t\tthis._el.media_container = DOM.create(\"div\", \"tl-timemarker-media-container\", this._el.content);\n\t\t\t// ugh. needs an overhaul\n\t\t\tvar mtd = { url: this.data.media.thumbnail };\n\t\t\tvar thumbnail_media_type = (this.data.media.thumbnail) ? lookupMediaType(mtd, true) : null;\n\t\t\tif (thumbnail_media_type) {\n\t\t\t\tvar thumbnail_media = new thumbnail_media_type.cls(mtd);\n\t\t\t\tthumbnail_media.on(\"loaded\", function () {\n\t\t\t\t\tthis._el.media = DOM.create(\"img\", \"tl-timemarker-media\", this._el.media_container);\n\t\t\t\t\tthis._el.media.src = thumbnail_media.getImageURL();\n\t\t\t\t}.bind(this));\n\t\t\t\tthumbnail_media.loadMedia();\n\t\t\t} else {\n\t\t\t\tvar media_type = lookupMediaType(this.data.media).type;\n\t\t\t\tthis._el.media = DOM.create(\"span\", \"tl-icon-\" + media_type, this._el.media_container);\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Text\n\t\tthis._el.text = DOM.create(\"div\", \"tl-timemarker-text\", this._el.content);\n\t\tthis._text = DOM.create(\"h2\", \"tl-headline\", this._el.text);\n\t\tif (this.data.text.headline && this.data.text.headline != \"\") {\n\t\t\tthis._text.innerHTML = unlinkify(this.data.text.headline);\n\t\t} else if (this.data.text.text && this.data.text.text != \"\") {\n\t\t\tthis._text.innerHTML = unlinkify(this.data.text.text);\n\t\t} else if (this.data.media && this.data.media.caption && this.data.media.caption != \"\") {\n\t\t\tthis._text.innerHTML = unlinkify(this.data.media.caption);\n\t\t}\n\n\n\n\t\t// Fire event that the slide is loaded\n\t\tthis.onLoaded();\n\n\t}\n\n\t_initEvents() {\n\t\tDOMEvent.addListener(this._el.container, 'click', this._onMarkerClick, this);\n\t}\n\n\t// Update Display\n\t_updateDisplay(width, height, layout) {\n\n\t\tif (width) {\n\t\t\tthis.options.width = width;\n\t\t}\n\n\t\tif (height) {\n\t\t\tthis.options.height = height;\n\t\t}\n\n\t}\n\n}\n\n\nclassMixin(TimeMarker, Events, DOMMixins)\n","import { classMixin, mergeData } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { easeInOutQuint, easeOutStrong } from \"../animation/Ease\";\nimport { Animate } from \"../animation/Animate\"\nimport { touch as BROWSER_TOUCH } from \"../core/Browser\";\nimport { DOMEvent } from \"../dom/DOMEvent\"\n\nexport default class Swipable {\n\n\tconstructor(drag_elem, move_elem, options) {\n\t\t\n\t\t// DOM ELements \n\t\tthis._el = {\n\t\t\tdrag: drag_elem,\n\t\t\tmove: drag_elem\n\t\t};\n\n\t\tthis.mousedrag = {\n\t\t\tdown:\t\t\"mousedown\",\n\t\t\tup:\t\t\t\"mouseup\",\n\t\t\tleave:\t\t\"mouseleave\",\n\t\t\tmove:\t\t\"mousemove\"\n\t\t}\n\n\t\tthis.touchdrag = {\n\t\t\tdown:\t\t\"touchstart\",\n\t\t\tup:\t\t\t\"touchend\",\n\t\t\tleave:\t\t\"mouseleave\",\n\t\t\tmove:\t\t\"touchmove\"\n\t\t}\n\n\t\tif (move_elem) {\n\t\t\tthis._el.move = move_elem;\n\t\t}\n\t\t\n\t\t//Options\n\t\tthis.options = {\n\t\t\tsnap: false,\n\t\t\tenable:\t{\n\t\t\t\tx: true,\n\t\t\t\ty: true\n\t\t\t},\n\t\t\tconstraint: {\n\t\t\t\ttop: false,\n\t\t\t\tbottom: false,\n\t\t\t\tleft: 0,\n\t\t\t\tright: false\n\t\t\t},\n\t\t\tmomentum_multiplier: \t2000,\n\t\t\tduration: \t\t\t\t1000,\n\t\t\tease: \t\t\t\t\teaseInOutQuint\n\t\t};\n\t\t\n\t\t\n\t\t// Animation Object\n\t\tthis.animator = null;\n\t\t\n\t\t// Drag Event Type\n\t\tthis.dragevent = this.mousedrag;\n\t\t\n\t\tif (BROWSER_TOUCH) {\n\t\t\tthis.dragevent = this.touchdrag;\n\t\t}\n\t\t\n\t\t// Draggable Data\n\t\tthis.data = {\n\t\t\tsliding:\t\tfalse,\n\t\t\tdirection: \t\t\"none\",\n\t\t\tpagex: {\n\t\t\t\tstart:\t\t0,\n\t\t\t\tend:\t\t0\n\t\t\t},\n\t\t\tpagey: {\n\t\t\t\tstart:\t\t0,\n\t\t\t\tend:\t\t0\n\t\t\t},\n\t\t\tpos: {\n\t\t\t\tstart: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty:0\n\t\t\t\t},\n\t\t\t\tend: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty:0\n\t\t\t\t}\n\t\t\t},\n\t\t\tnew_pos: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0\n\t\t\t},\n\t\t\tnew_pos_parent: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0\n\t\t\t},\n\t\t\ttime: {\n\t\t\t\tstart:\t\t0,\n\t\t\t\tend:\t\t0\n\t\t\t},\n\t\t\ttouch:\t\t\tfalse\n\t\t};\n\t\t\n\t\t// Merge Data and Options\n\t\tmergeData(this.options, options);\n\t\t\n\t\t\n\t}\n\t\n\tenable(e) {\n\t\tDOMEvent.addListener(this._el.drag, this.dragevent.down, this._onDragStart, this);\n\t\tDOMEvent.addListener(this._el.drag, this.dragevent.up, this._onDragEnd, this);\n\t\t\n\t\tthis.data.pos.start = 0; \n\t\tthis._el.move.style.left = this.data.pos.start.x + \"px\";\n\t\tthis._el.move.style.top = this.data.pos.start.y + \"px\";\n\t\tthis._el.move.style.position = \"absolute\";\n\t\t//this._el.move.style.zIndex = \"11\";\n\t\t//this._el.move.style.cursor = \"move\";\n\t}\n\t\n\tdisable() {\n\t\tDOMEvent.removeListener(this._el.drag, this.dragevent.down, this._onDragStart, this);\n\t\tDOMEvent.removeListener(this._el.drag, this.dragevent.up, this._onDragEnd, this);\n\t}\n\t\n\tstopMomentum() {\n\t\tif (this.animator) {\n\t\t\tthis.animator.stop();\n\t\t}\n\n\t}\n\t\n\tupdateConstraint(c) {\n\t\tthis.options.constraint = c;\n\t\t\n\t\t// Temporary until issues are fixed\n\t\t\n\t}\n\t\n\t/*\tPrivate Methods\n\t================================================== */\n\t_onDragStart(e) {\n\t\t\n\t\tif (this.animator) {\n\t\t\tthis.animator.stop();\n\t\t}\n\t\t\n\t\tif (BROWSER_TOUCH) {\n\t\t\tif (e.originalEvent) {\n\t\t\t\tthis.data.pagex.start = e.originalEvent.touches[0].screenX;\n\t\t\t\tthis.data.pagey.start = e.originalEvent.touches[0].screenY;\n\t\t\t} else {\n\t\t\t\tthis.data.pagex.start = e.targetTouches[0].screenX;\n\t\t\t\tthis.data.pagey.start = e.targetTouches[0].screenY;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.data.pagex.start = e.pageX;\n\t\t\tthis.data.pagey.start = e.pageY;\n\t\t}\n\t\t\n\t\t// Center element to finger or mouse\n\t\tif (this.options.enable.x) {\n\t\t\t//this._el.move.style.left = this.data.pagex.start - (this._el.move.offsetWidth / 2) + \"px\";\n\t\t}\n\t\t\n\t\tif (this.options.enable.y) {\n\t\t\t//this._el.move.style.top = this.data.pagey.start - (this._el.move.offsetHeight / 2) + \"px\";\n\t\t}\n\t\t\n\t\tthis.data.pos.start = {x:this._el.move.offsetLeft, y:this._el.move.offsetTop};\n\t\t\n\t\t\n\t\tthis.data.time.start \t\t\t= new Date().getTime();\n\t\t\n\t\tthis.fire(\"dragstart\", this.data);\n\t\tDOMEvent.addListener(this._el.drag, this.dragevent.move, this._onDragMove, this);\n\t\tDOMEvent.addListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);\n\t}\n\t\n\t_onDragEnd(e) {\n\t\tthis.data.sliding = false;\n\t\tDOMEvent.removeListener(this._el.drag, this.dragevent.move, this._onDragMove, this);\n\t\tDOMEvent.removeListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);\n\t\tthis.fire(\"dragend\", this.data);\n\t\t\n\t\t// momentum\n\t\tthis._momentum();\n\t}\n\t\n\t_onDragMove(e) {\n\t\tvar change = {\n\t\t\tx:0,\n\t\t\ty:0\n\t\t}\n\t\t//e.preventDefault();\n\t\tthis.data.sliding = true;\n\t\t\n\t\tif (BROWSER_TOUCH) {\n\t\t\tif (e.originalEvent) {\n\t\t\t\tthis.data.pagex.end = e.originalEvent.touches[0].screenX;\n\t\t\t\tthis.data.pagey.end = e.originalEvent.touches[0].screenY;\n\t\t\t} else {\n\t\t\t\tthis.data.pagex.end = e.targetTouches[0].screenX;\n\t\t\t\tthis.data.pagey.end = e.targetTouches[0].screenY;\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis.data.pagex.end = e.pageX;\n\t\t\tthis.data.pagey.end = e.pageY;\n\t\t}\n\t\t\n\t\tchange.x = this.data.pagex.start - this.data.pagex.end;\n\t\tchange.y = this.data.pagey.start - this.data.pagey.end;\n\t\t\n\t\tthis.data.pos.end = {x:this._el.drag.offsetLeft, y:this._el.drag.offsetTop};\n\t\t\n\t\tthis.data.new_pos.x = -(change.x - this.data.pos.start.x);\n\t\tthis.data.new_pos.y = -(change.y - this.data.pos.start.y );\n\t\t\n\t\tif (this.options.enable.x && ( Math.abs(change.x) > Math.abs(change.y) ) ) {\n\t\t\te.preventDefault();\n\t\t\tthis._el.move.style.left = this.data.new_pos.x + \"px\";\n\t\t}\n\t\t\n\t\tif (this.options.enable.y && ( Math.abs(change.y) > Math.abs(change.y) ) ) {\n\t\t\te.preventDefault();\n\t\t\tthis._el.move.style.top = this.data.new_pos.y + \"px\";\n\t\t}\n\t\t\n\t\tthis.fire(\"dragmove\", this.data);\n\t}\n\t\n\t_momentum() {\n\t\tvar pos_adjust = {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttime: 0\n\t\t\t},\n\t\t\tpos_change = {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttime: 0\n\t\t\t},\n\t\t\tswipe_detect = {\n\t\t\t\tx: false,\n\t\t\t\ty: false\n\t\t\t},\n\t\t\tswipe = false,\n\t\t\tswipe_direction = \"\";\n\t\t\n\t\t\n\t\tthis.data.direction = null;\n\t\t\n\t\tpos_adjust.time = (new Date().getTime() - this.data.time.start) * 10;\n\t\tpos_change.time = (new Date().getTime() - this.data.time.start) * 10;\n\t\t\n\t\tpos_change.x = this.options.momentum_multiplier * (Math.abs(this.data.pagex.end) - Math.abs(this.data.pagex.start));\n\t\tpos_change.y = this.options.momentum_multiplier * (Math.abs(this.data.pagey.end) - Math.abs(this.data.pagey.start));\n\t\t\n\t\tpos_adjust.x = Math.round(pos_change.x / pos_change.time);\n\t\tpos_adjust.y = Math.round(pos_change.y / pos_change.time);\n\t\t\n\t\tthis.data.new_pos.x = Math.min(this.data.new_pos.x + pos_adjust.x);\n\t\tthis.data.new_pos.y = Math.min(this.data.new_pos.y + pos_adjust.y);\n\t\t\n\t\tif (!this.options.enable.x) {\n\t\t\tthis.data.new_pos.x = this.data.pos.start.x;\n\t\t} else if (this.options.constraint.left && this.data.new_pos.x > this.options.constraint.left) {\n\t\t\tthis.data.new_pos.x = this.options.constraint.left;\n\t\t}\n\t\t\n\t\tif (!this.options.enable.y) {\n\t\t\tthis.data.new_pos.y = this.data.pos.start.y;\n\t\t} else if (this.data.new_pos.y < 0) {\n\t\t\tthis.data.new_pos.y = 0;\n\t\t}\n\t\t\n\t\t// Detect Swipe\n\t\tif (pos_change.time < 2000) {\n\t\t\tswipe = true;\n\t\t}\n\t\t\n\t\t\n\t\tif (this.options.enable.x && this.options.enable.y) {\n\t\t\tif (Math.abs(pos_change.x) > Math.abs(pos_change.y)) {\n\t\t\t\tswipe_detect.x = true;\n\t\t\t} else {\n\t\t\t\tswipe_detect.y = true;\n\t\t\t}\n\t\t} else if (this.options.enable.x) {\n\t\t\tif (Math.abs(pos_change.x) > Math.abs(pos_change.y)) {\n\t\t\t\tswipe_detect.x = true;\n\t\t\t}\n\t\t} else {\n\t\t\tif (Math.abs(pos_change.y) > Math.abs(pos_change.x)) {\n\t\t\t\tswipe_detect.y = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Detect Direction and long swipe\n\t\tif (swipe_detect.x) {\n\t\t\t\n\t\t\t// Long Swipe\n\t\t\tif (Math.abs(pos_change.x) > (this._el.drag.offsetWidth/2)) {\n\t\t\t\tswipe = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (Math.abs(pos_change.x) > 10000) {\n\t\t\t\tthis.data.direction = \"left\";\n\t\t\t\tif (pos_change.x > 0) {\n\t\t\t\t\tthis.data.direction = \"right\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (swipe_detect.y) {\n\t\t\t\n\t\t\t// Long Swipe\n\t\t\tif (Math.abs(pos_change.y) > (this._el.drag.offsetHeight/2)) {\n\t\t\t\tswipe = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (Math.abs(pos_change.y) > 10000) {\n\t\t\t\tthis.data.direction = \"up\";\n\t\t\t\tif (pos_change.y > 0) {\n\t\t\t\t\tthis.data.direction = \"down\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (pos_change.time < 1000 ) {\n\t\t\t\n\t\t} else {\n\t\t\tthis._animateMomentum();\n\t\t}\n\t\t\n\t\tif (swipe && this.data.direction) {\n\t\t\tthis.fire(\"swipe_\" + this.data.direction, this.data);\n\t\t} else if (this.data.direction) {\n\t\t\tthis.fire(\"swipe_nodirection\", this.data);\n\t\t} else if (this.options.snap) {\n\t\t\tthis.animator.stop();\n\t\t\t\n\t\t\tthis.animator = Animate(this._el.move, {\n\t\t\t\ttop: \t\tthis.data.pos.start.y,\n\t\t\t\tleft: \t\tthis.data.pos.start.x,\n\t\t\t\tduration: \tthis.options.duration,\n\t\t\t\teasing: \teaseOutStrong\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\t\n\t_animateMomentum() {\n\t\tvar pos = {\n\t\t\t\tx: this.data.new_pos.x,\n\t\t\t\ty: this.data.new_pos.y\n\t\t\t},\n\t\t\tanimate = {\n\t\t\t\tduration: \tthis.options.duration,\n\t\t\t\teasing: \teaseOutStrong\n\t\t\t};\n\t\t\n\t\tif (this.options.enable.y) {\n\t\t\tif (this.options.constraint.top || this.options.constraint.bottom) {\n\t\t\t\tif (pos.y > this.options.constraint.bottom) {\n\t\t\t\t\tpos.y = this.options.constraint.bottom;\n\t\t\t\t} else if (pos.y < this.options.constraint.top) {\n\t\t\t\t\tpos.y = this.options.constraint.top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tanimate.top = Math.floor(pos.y) + \"px\";\n\t\t}\n\t\t\n\t\tif (this.options.enable.x) {\n\t\t\tif (this.options.constraint.left && pos.x >= this.options.constraint.left) {\n\t\t\t\tpos.x = this.options.constraint.left;\n\t\t\t}\n\t\t\tif (this.options.constraint.right && pos.x < this.options.constraint.right) {\n\t\t\t\tpos.x = this.options.constraint.right;\n\t\t\t}\n\n\t\t\tanimate.left = Math.floor(pos.x) + \"px\";\n\t\t}\n\t\t\n\t\tthis.animator = Animate(this._el.move, animate);\n\t\t\n\t\tthis.fire(\"momentum\", this.data);\n\t}\n}\n\nclassMixin(Swipable, Events)","import { classMixin, mergeData, findNextGreater, findNextLesser, isEven, findArrayNumberByUniqueID, trace } from \"../core/Util\"\nimport Events from \"../core/Events\"\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport * as DOM from \"../dom/DOM\"\nimport { easeInOutQuint } from \"../animation/Ease\";\nimport { TimeScale } from \"./TimeScale\"\nimport { TimeGroup } from \"./TimeGroup\"\nimport { TimeEra } from \"./TimeEra\"\nimport { TimeAxis } from \"./TimeAxis\"\nimport { TimeMarker } from \"./TimeMarker\"\nimport Swipable from \"../ui/Swipable\"\nimport { Animate } from \"../animation/Animate\"\n\n\n\nexport class TimeNav {\n\n constructor(elem, timeline_config, options, language) {\n this.language = language // just passing through for TimeAxis. Is this a bad code smell?\n // DOM ELEMENTS\n this._el = {\n parent: {},\n container: {},\n slider: {},\n slider_background: {},\n line: {},\n marker_container_mask: {},\n marker_container: {},\n marker_item_container: {},\n timeaxis: {},\n timeaxis_background: {},\n attribution: {}\n };\n\n this.collapsed = false;\n\n if (typeof elem === 'object') {\n this._el.container = elem;\n } else {\n this._el.container = DOM.get(elem);\n }\n\n this.config = timeline_config;\n\n //Options\n this.options = {\n width: 600,\n height: 600,\n duration: 1000,\n ease: easeInOutQuint,\n has_groups: false,\n optimal_tick_width: 50,\n scale_factor: 2, // How many screen widths wide should the timeline be\n marker_padding: 5,\n timenav_height_min: 150, // Minimum timenav height\n marker_height_min: 30, // Minimum Marker Height\n marker_width_min: 100, // Minimum Marker Width\n zoom_sequence: [0.5, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] // Array of Fibonacci numbers for TimeNav zoom levels http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html\n };\n\n // Animation\n this.animator = null;\n\n // Ready state\n this.ready = false;\n\n // Markers Array\n this._markers = [];\n\n // Eras Array\n this._eras = [];\n this.has_eras = false;\n\n // Groups Array\n this._groups = [];\n\n // Row Height\n this._calculated_row_height = 100;\n\n // Current Marker\n this.current_id = \"\";\n\n // TimeScale\n this.timescale = {};\n\n // TimeAxis\n this.timeaxis = {};\n\n // Max Rows\n this.max_rows = 6;\n\n // Animate CSS\n this.animate_css = false;\n\n // Swipe Object\n this._swipable;\n\n // Merge Data and Options\n mergeData(this.options, options);\n\n }\n\n init() {\n this._initLayout();\n this._initEvents();\n this._initData();\n this.updateDisplay();\n\n this._onLoaded();\n }\n\n /*\tPublic\n ================================================== */\n positionMarkers(fast) {\n // POSITION X\n for (var i = 0; i < this._markers.length; i++) {\n var pos = this.timescale.getPositionInfo(i);\n if (fast) {\n this._markers[i].setClass(\"tl-timemarker tl-timemarker-fast\");\n } else {\n this._markers[i].setClass(\"tl-timemarker\");\n }\n this._markers[i].setPosition({ left: pos.start });\n this._markers[i].setWidth(pos.width);\n };\n }\n\n /*\tUpdate Display\n ================================================== */\n updateDisplay(width, height, animate) {\n let reposition_markers = false;\n if (width) {\n if (this.options.width == 0 && width > 0) {\n reposition_markers = true;\n }\n this.options.width = width;\n }\n if (height && height != this.options.height) {\n this.options.height = height;\n this.timescale = this._getTimeScale();\n }\n\n // Size Markers\n this._assignRowsToMarkers();\n\n // Size swipable area\n this._el.slider_background.style.width = this.timescale.getPixelWidth() + this.options.width + \"px\";\n this._el.slider_background.style.left = -(this.options.width / 2) + \"px\";\n this._el.slider.style.width = this.timescale.getPixelWidth() + this.options.width + \"px\";\n\n // Update Swipable constraint\n this._swipable.updateConstraint({ top: false, bottom: false, left: (this.options.width / 2), right: -(this.timescale.getPixelWidth() - (this.options.width / 2)) });\n\n if (reposition_markers) {\n this._drawTimeline()\n }\n // Go to the current slide\n this.goToId(this.current_id, true);\n }\n\n\n /*\tTimeScale\n ================================================== */\n _getTimeScale() {\n /* maybe the establishing config values (marker_height_min and max_rows) should be\n separated from making a TimeScale object, which happens in another spot in this file with duplicate mapping of properties of this TimeNav into the TimeScale options object? */\n // Set Max Rows\n var marker_height_min = 0;\n try {\n marker_height_min = parseInt(this.options.marker_height_min);\n } catch (e) {\n trace(\"Invalid value for marker_height_min option.\");\n marker_height_min = 30;\n }\n if (marker_height_min == 0) {\n trace(\"marker_height_min option must not be zero.\")\n marker_height_min = 30;\n }\n this.max_rows = Math.round((this.options.height - this._el.timeaxis_background.offsetHeight - (this.options.marker_padding)) / marker_height_min);\n if (this.max_rows < 1) {\n this.max_rows = 1;\n }\n return new TimeScale(this.config, {\n display_width: this._el.container.offsetWidth,\n screen_multiplier: this.options.scale_factor,\n max_rows: this.max_rows\n\n });\n }\n\n _updateTimeScale(new_scale) {\n this.options.scale_factor = new_scale;\n this._updateDrawTimeline();\n }\n\n zoomIn() { // move the the next \"higher\" scale factor\n var new_scale = findNextGreater(this.options.zoom_sequence, this.options.scale_factor);\n this.setZoomFactor(new_scale);\n }\n\n zoomOut() { // move the the next \"lower\" scale factor\n var new_scale = findNextLesser(this.options.zoom_sequence, this.options.scale_factor);\n this.setZoomFactor(new_scale);\n }\n\n setZoom(level) {\n var zoom_factor = this.options.zoom_sequence[level];\n if (typeof(zoom_factor) == 'number') {\n this.setZoomFactor(zoom_factor);\n } else {\n console.warn(\"Invalid zoom level. Please use an index number between 0 and \" + (this.options.zoom_sequence.length - 1));\n }\n }\n\n setZoomFactor(factor) {\n if (factor <= this.options.zoom_sequence[0]) {\n this.fire(\"zoomtoggle\", { zoom: \"out\", show: false });\n } else {\n this.fire(\"zoomtoggle\", { zoom: \"out\", show: true });\n }\n\n if (factor >= this.options.zoom_sequence[this.options.zoom_sequence.length - 1]) {\n this.fire(\"zoomtoggle\", { zoom: \"in\", show: false });\n } else {\n this.fire(\"zoomtoggle\", { zoom: \"in\", show: true });\n }\n\n if (factor == 0) {\n console.warn(\"Zoom factor must be greater than zero. Using 0.1\");\n factor = 0.1;\n }\n this.options.scale_factor = factor;\n //this._updateDrawTimeline(true);\n this.goToId(this.current_id, !this._updateDrawTimeline(true), true);\n }\n\n /*\tGroups\n ================================================== */\n _createGroups() {\n this._groups = [];\n var group_labels = this.timescale.getGroupLabels();\n\n if (group_labels) {\n this.options.has_groups = true;\n for (var i = 0; i < group_labels.length; i++) {\n this._createGroup(group_labels[i]);\n }\n }\n\n }\n\n _createGroup(group_label) {\n var group = new TimeGroup(group_label);\n this._addGroup(group);\n this._groups.push(group);\n }\n\n _addGroup(group) {\n group.addTo(this._el.container);\n\n }\n\n _positionGroups() {\n if (this.options.has_groups) {\n var available_height = (this.options.height - this._el.timeaxis_background.offsetHeight),\n group_height = Math.floor((available_height / this.timescale.getNumberOfRows()) - this.options.marker_padding),\n group_labels = this.timescale.getGroupLabels();\n\n for (var i = 0, group_rows = 0; i < this._groups.length; i++) {\n var group_y = Math.floor(group_rows * (group_height + this.options.marker_padding));\n var group_hide = false;\n if (group_y > (available_height - this.options.marker_padding)) {\n group_hide = true;\n }\n\n this._groups[i].setRowPosition(group_y, this._calculated_row_height + this.options.marker_padding / 2);\n this._groups[i].setAlternateRowColor(isEven(i), group_hide);\n\n group_rows += this._groups[i].data.rows; // account for groups spanning multiple rows\n }\n }\n }\n\n /*\tMarkers\n ================================================== */\n _addMarker(marker) {\n marker.addTo(this._el.marker_item_container);\n marker.on('markerclick', this._onMarkerClick, this);\n marker.on('added', this._onMarkerAdded, this);\n }\n\n _createMarker(data, n) {\n var marker = new TimeMarker(data, this.options);\n this._addMarker(marker);\n if (n < 0) {\n this._markers.push(marker);\n } else {\n this._markers.splice(n, 0, marker);\n }\n }\n\n _createMarkers(array) {\n for (var i = 0; i < array.length; i++) {\n this._createMarker(array[i], -1);\n }\n }\n\n _removeMarker(marker) {\n marker.removeFrom(this._el.marker_item_container);\n //marker.off('added', this._onMarkerRemoved, this);\n }\n\n _destroyMarker(n) {\n this._removeMarker(this._markers[n]);\n this._markers.splice(n, 1);\n }\n\n _calculateMarkerHeight(h) {\n return ((h / this.timescale.getNumberOfRows()) - this.options.marker_padding);\n }\n\n _calculateRowHeight(h) {\n return (h / this.timescale.getNumberOfRows());\n }\n\n _calculateAvailableHeight() {\n return (this.options.height - this._el.timeaxis_background.offsetHeight - (this.options.marker_padding));\n }\n\n _calculateMinimumTimeNavHeight() {\n return (this.timescale.getNumberOfRows() * this.options.marker_height_min) + this._el.timeaxis_background.offsetHeight + (this.options.marker_padding);\n\n }\n\n getMinimumHeight() {\n return this._calculateMinimumTimeNavHeight();\n }\n\n _assignRowsToMarkers() {\n var available_height = this._calculateAvailableHeight(),\n marker_height = this._calculateMarkerHeight(available_height);\n\n\n this._positionGroups();\n\n this._calculated_row_height = this._calculateRowHeight(available_height);\n\n for (var i = 0; i < this._markers.length; i++) {\n\n // Set Height\n this._markers[i].setHeight(marker_height);\n\n //Position by Row\n var row = this.timescale.getPositionInfo(i).row;\n\n var marker_y = Math.floor(row * (marker_height + this.options.marker_padding)) + this.options.marker_padding;\n\n var remainder_height = available_height - marker_y + this.options.marker_padding;\n this._markers[i].setRowPosition(marker_y, remainder_height);\n };\n\n }\n\n _resetMarkersActive() {\n for (var i = 0; i < this._markers.length; i++) {\n this._markers[i].setActive(false);\n };\n }\n\n _findMarkerIndex(n) {\n var _n = -1;\n if (typeof n == 'string' || n instanceof String) {\n _n = findArrayNumberByUniqueID(n, this._markers, \"unique_id\", _n);\n }\n return _n;\n }\n\n /*\tERAS\n ================================================== */\n _createEras(array) {\n for (var i = 0; i < array.length; i++) {\n var data = array[i];\n var era = new TimeEra(data.start_date,\n data.end_date,\n data.headline,\n this.options);\n this._eras.push(era);\n era.addTo(this._el.marker_item_container);\n era.on('added', this._onEraAdded, this);\n }\n }\n\n _positionEras(fast) {\n\n var era_color = 0;\n // POSITION X\n for (var i = 0; i < this._eras.length; i++) {\n var pos = {\n start: 0,\n end: 0,\n width: 0\n };\n\n pos.start = this.timescale.getPosition(this._eras[i].start_date.getTime());\n pos.end = this.timescale.getPosition(this._eras[i].end_date.getTime());\n pos.width = pos.end - pos.start;\n\n if (fast) {\n this._eras[i].setClass(\"tl-timeera tl-timeera-fast\");\n } else {\n this._eras[i].setClass(\"tl-timeera\");\n }\n this._eras[i].setPosition({ left: pos.start });\n this._eras[i].setWidth(pos.width);\n\n era_color++;\n if (era_color > 5) {\n era_color = 0;\n }\n this._eras[i].setColor(era_color);\n };\n\n }\n\n /*\tPublic\n ================================================== */\n\n // Create a marker\n createMarker(d, n) {\n this._createMarker(d, n);\n }\n\n // Create many markers from an array\n createMarkers(array) {\n this._createMarkers(array);\n }\n\n // Destroy marker by index\n destroyMarker(n) {\n this._destroyMarker(n);\n }\n\n // Destroy marker by id\n destroyMarkerId(id) {\n this.destroyMarker(this._findMarkerIndex(id));\n }\n\n /*\tNavigation\n ================================================== */\n goTo(n, fast, css_animation) {\n var self = this,\n _ease = this.options.ease,\n _duration = this.options.duration,\n _n = (n < 0) ? 0 : n;\n\n // Set Marker active state\n this._resetMarkersActive();\n if (n >= 0 && n < this._markers.length) {\n this._markers[n].setActive(true);\n }\n // Stop animation\n if (this.animator) {\n this.animator.stop();\n }\n\n if (fast) {\n this._el.slider.className = \"tl-timenav-slider\";\n this._el.slider.style.left = -this._markers[_n].getLeft() + (this.options.width / 2) + \"px\";\n } else {\n if (css_animation) {\n this._el.slider.className = \"tl-timenav-slider tl-timenav-slider-animate\";\n this.animate_css = true;\n this._el.slider.style.left = -this._markers[_n].getLeft() + (this.options.width / 2) + \"px\";\n } else {\n this._el.slider.className = \"tl-timenav-slider\";\n this.animator = Animate(this._el.slider, {\n left: -this._markers[_n].getLeft() + (this.options.width / 2) + \"px\",\n duration: _duration,\n easing: _ease\n });\n }\n }\n\n if (n >= 0 && n < this._markers.length) {\n this.current_id = this._markers[n].data.unique_id;\n } else {\n this.current_id = '';\n }\n }\n\n goToId(id, fast, css_animation) {\n this.goTo(this._findMarkerIndex(id), fast, css_animation);\n }\n\n /*\tEvents\n ================================================== */\n _onLoaded() {\n this.ready = true;\n this.fire(\"loaded\", this.config);\n }\n\n _onMarkerAdded(e) {\n this.fire(\"dateAdded\", this.config);\n }\n\n _onEraAdded(e) {\n this.fire(\"eraAdded\", this.config);\n }\n\n _onMarkerRemoved(e) {\n this.fire(\"dateRemoved\", this.config);\n }\n\n _onMarkerClick(e) {\n // Go to the clicked marker\n this.goToId(e.unique_id);\n this.fire(\"change\", { unique_id: e.unique_id });\n }\n\n _onMouseScroll(e) {\n\n var delta = 0,\n scroll_to = 0,\n constraint = {\n right: -(this.timescale.getPixelWidth() - (this.options.width / 2)),\n left: this.options.width / 2\n };\n if (!e) {\n e = window.event;\n }\n if (e.originalEvent) {\n e = e.originalEvent;\n }\n\n // Webkit and browsers able to differntiate between up/down and left/right scrolling\n if (typeof e.wheelDeltaX != 'undefined') {\n delta = e.wheelDeltaY / 6;\n if (Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY)) {\n delta = e.wheelDeltaX / 6;\n } else {\n //delta = e.wheelDeltaY/6;\n delta = 0;\n }\n }\n if (delta) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.returnValue = false;\n }\n // Stop from scrolling too far\n scroll_to = parseInt(this._el.slider.style.left.replace(\"px\", \"\")) + delta;\n\n\n if (scroll_to > constraint.left) {\n scroll_to = constraint.left;\n } else if (scroll_to < constraint.right) {\n scroll_to = constraint.right;\n }\n\n if (this.animate_css) {\n this._el.slider.className = \"tl-timenav-slider\";\n this.animate_css = false;\n }\n\n this._el.slider.style.left = scroll_to + \"px\";\n\n }\n\n _onDragMove(e) {\n if (this.animate_css) {\n this._el.slider.className = \"tl-timenav-slider\";\n this.animate_css = false;\n }\n\n }\n\n /*\tPrivate Methods\n ================================================== */\n\n _drawTimeline(fast) {\n this.timescale = this._getTimeScale();\n this.timeaxis.drawTicks(this.timescale, this.options.optimal_tick_width);\n this.positionMarkers(fast);\n this._assignRowsToMarkers();\n this._createGroups();\n this._positionGroups();\n\n if (this.has_eras) {\n\n this._positionEras(fast);\n }\n }\n\n _updateDrawTimeline(check_update) {\n var do_update = false;\n\n // Check to see if redraw is needed\n if (check_update) {\n /* keep this aligned with _getTimeScale or reduce code duplication */\n var temp_timescale = new TimeScale(this.config, {\n display_width: this._el.container.offsetWidth,\n screen_multiplier: this.options.scale_factor,\n max_rows: this.max_rows\n\n });\n\n if (this.timescale.getMajorScale() == temp_timescale.getMajorScale() &&\n this.timescale.getMinorScale() == temp_timescale.getMinorScale()) {\n do_update = true;\n }\n } else {\n do_update = true;\n }\n\n // Perform update or redraw\n if (do_update) {\n this.timescale = this._getTimeScale();\n this.timeaxis.positionTicks(this.timescale, this.options.optimal_tick_width);\n this.positionMarkers();\n this._assignRowsToMarkers();\n this._positionGroups();\n if (this.has_eras) {\n this._positionEras();\n }\n this.updateDisplay();\n } else {\n this._drawTimeline(true);\n }\n\n return do_update;\n\n }\n\n\n /*\tInit\n ================================================== */\n _initLayout() {\n // Create Layout\n this._el.attribution = DOM.create('div', 'tl-attribution', this._el.container);\n this._el.line = DOM.create('div', 'tl-timenav-line', this._el.container);\n this._el.slider = DOM.create('div', 'tl-timenav-slider', this._el.container);\n this._el.slider_background = DOM.create('div', 'tl-timenav-slider-background', this._el.slider);\n this._el.marker_container_mask = DOM.create('div', 'tl-timenav-container-mask', this._el.slider);\n this._el.marker_container = DOM.create('div', 'tl-timenav-container', this._el.marker_container_mask);\n this._el.marker_item_container = DOM.create('div', 'tl-timenav-item-container', this._el.marker_container);\n this._el.timeaxis = DOM.create('div', 'tl-timeaxis', this._el.slider);\n this._el.timeaxis_background = DOM.create('div', 'tl-timeaxis-background', this._el.container);\n\n\n // Knight Lab Logo\n this._el.attribution.innerHTML = \"<a href='http://timeline.knightlab.com' target='_blank' rel='noopener'><span class='tl-knightlab-logo'></span>TimelineJS</a>\"\n\n // Time Axis\n this.timeaxis = new TimeAxis(this._el.timeaxis, this.options, this.language);\n\n // Swipable\n this._swipable = new Swipable(this._el.slider_background, this._el.slider, {\n enable: { x: true, y: false },\n constraint: { top: false, bottom: false, left: (this.options.width / 2), right: false },\n snap: false\n });\n this._swipable.enable();\n\n }\n\n _initEvents() {\n // Drag Events\n this._swipable.on('dragmove', this._onDragMove, this);\n\n // Scroll Events\n DOMEvent.addListener(this._el.container, 'mousewheel', this._onMouseScroll, this);\n DOMEvent.addListener(this._el.container, 'DOMMouseScroll', this._onMouseScroll, this);\n }\n\n _initData() {\n // Create Markers and then add them\n this._createMarkers(this.config.events);\n\n if (this.config.eras && this.config.eras.length > 0) {\n this.has_eras = true;\n this._createEras(this.config.eras);\n }\n\n this._drawTimeline();\n\n }\n}\n\nclassMixin(TimeNav, Events, DOMMixins)","import { addClass } from \"../dom/DOMUtil\"\nimport { I18NMixins } from \"../language/I18NMixins\";\nimport Events from \"../core/Events\";\nimport { DOMMixins } from \"../dom/DOMMixins\";\nimport { classMixin, mergeData, trim } from \"../core/Util\"\nimport * as DOM from \"../dom/DOM\"\nimport { Animate } from \"../animation/Animate\"\nimport { easeInSpline } from \"../animation/Ease\"\nimport * as Browser from \"../core/Browser\"\nimport { lookupMediaType } from \"../media/MediaType\";\nimport { Text } from \"../media/Media\"\n\nexport class Slide {\n\n constructor(data, options, title_slide, language) {\n if (language) {\n this.setLanguage(language)\n }\n\n // DOM Elements\n this._el = {\n container: {},\n scroll_container: {},\n background: {},\n content_container: {},\n content: {}\n };\n\n // Components\n this._media = null;\n this._mediaclass = {};\n this._text = {};\n this._background_media = null;\n\n // State\n this._state = {\n loaded: false\n };\n\n this.has = {\n headline: false,\n text: false,\n media: false,\n title: false,\n background: {\n image: false,\n color: false,\n color_value: \"\"\n }\n }\n\n this.has.title = title_slide;\n\n // Data\n this.data = {\n unique_id: null,\n background: null,\n start_date: null,\n end_date: null,\n location: null,\n text: null,\n media: null,\n autolink: true\n };\n\n // Options\n this.options = {\n // animation\n duration: 1000,\n slide_padding_lr: 40,\n ease: easeInSpline,\n width: 600,\n height: 600,\n skinny_size: 650,\n media_name: \"\"\n };\n\n // Actively Displaying\n this.active = false;\n\n // Animation Object\n this.animator = {};\n\n // Merge Data and Options\n mergeData(this.options, options);\n mergeData(this.data, data);\n\n this._initLayout();\n this._initEvents();\n\n\n }\n\n /*\tAdding, Hiding, Showing etc\n ================================================== */\n show() {\n this.animator = Animate(this._el.slider_container, {\n left: -(this._el.container.offsetWidth * n) + \"px\",\n duration: this.options.duration,\n easing: this.options.ease\n });\n }\n\n hide() {\n\n }\n\n setActive(is_active) {\n this.active = is_active;\n\n if (this.active) {\n if (this.data.background) {\n this.fire(\"background_change\", this.has.background);\n }\n this.loadMedia();\n } else {\n this.stopMedia();\n }\n }\n\n addTo(container) {\n container.appendChild(this._el.container);\n //this.onAdd();\n }\n\n removeFrom(container) {\n container.removeChild(this._el.container);\n }\n\n updateDisplay(width, height, layout) {\n var content_width,\n content_padding_left = this.options.slide_padding_lr,\n content_padding_right = this.options.slide_padding_lr;\n\n if (width) {\n this.options.width = width;\n } else {\n this.options.width = this._el.container.offsetWidth;\n }\n\n content_width = this.options.width - (this.options.slide_padding_lr * 2);\n\n if (Browser.mobile && (this.options.width <= this.options.skinny_size)) {\n content_padding_left = 0;\n content_padding_right = 0;\n content_width = this.options.width;\n } else if (layout == \"landscape\") {\n\n } else if (this.options.width <= this.options.skinny_size) {\n content_padding_left = 50;\n content_padding_right = 50;\n content_width = this.options.width - content_padding_left - content_padding_right;\n } else {\n\n }\n\n this._el.content.style.paddingLeft = content_padding_left + \"px\";\n this._el.content.style.paddingRight = content_padding_right + \"px\";\n this._el.content.style.width = content_width + \"px\";\n\n if (height) {\n this.options.height = height;\n //this._el.scroll_container.style.height\t\t= this.options.height + \"px\";\n\n } else {\n this.options.height = this._el.container.offsetHeight;\n }\n\n if (this._media) {\n\n if (!this.has.text && this.has.headline) {\n this._media.updateDisplay(content_width, (this.options.height - this._text.headlineHeight()), layout);\n } else if (!this.has.text && !this.has.headline) {\n this._media.updateDisplay(content_width, this.options.height, layout);\n } else if (this.options.width <= this.options.skinny_size) {\n this._media.updateDisplay(content_width, this.options.height, layout);\n } else {\n this._media.updateDisplay(content_width / 2, this.options.height, layout);\n }\n }\n\n this._updateBackgroundDisplay();\n }\n\n loadMedia() {\n var self = this;\n\n if (this._media && !this._state.loaded) {\n this._media.loadMedia();\n this._state.loaded = true;\n }\n\n if (this._background_media && !this._background_media._state.loaded) {\n this._background_media.on(\"loaded\", function() {\n self._updateBackgroundDisplay();\n });\n this._background_media.loadMedia();\n }\n }\n\n stopMedia() {\n if (this._media && this._state.loaded) {\n this._media.stopMedia();\n }\n }\n\n getBackground() {\n return this.has.background;\n }\n\n scrollToTop() {\n this._el.container.scrollTop = 0;\n }\n\n getFormattedDate() {\n\n if (trim(this.data.display_date).length > 0) {\n return this.data.display_date;\n }\n var date_text = \"\";\n\n if (!this.has.title) {\n if (this.data.end_date) {\n date_text = \" — \" + this.data.end_date.getDisplayDate(this.getLanguage());\n }\n if (this.data.start_date) {\n date_text = this.data.start_date.getDisplayDate(this.getLanguage()) + date_text;\n }\n }\n return date_text;\n }\n\n /*\tEvents\n ================================================== */\n\n\n /*\tPrivate Methods\n ================================================== */\n _initLayout() {\n // Create Layout\n this._el.container = DOM.create(\"div\", \"tl-slide\");\n\n if (this.has.title) {\n this._el.container.className = \"tl-slide tl-slide-titleslide\";\n }\n\n if (this.data.unique_id) {\n this._el.container.id = this.data.unique_id;\n }\n this._el.scroll_container = DOM.create(\"div\", \"tl-slide-scrollable-container\", this._el.container);\n this._el.content_container = DOM.create(\"div\", \"tl-slide-content-container\", this._el.scroll_container);\n this._el.content = DOM.create(\"div\", \"tl-slide-content\", this._el.content_container);\n this._el.background = DOM.create(\"div\", \"tl-slide-background\", this._el.container);\n // Style Slide Background\n if (this.data.background) {\n if (this.data.background.url) {\n var media_type = lookupMediaType(this.data.background, true);\n if (media_type) {\n this._background_media = new media_type.cls(this.data.background, { background: 1 });\n\n this.has.background.image = true;\n this._el.container.className += ' tl-full-image-background';\n this.has.background.color_value = \"#000\";\n this._el.background.style.display = \"block\";\n }\n }\n if (this.data.background.color) {\n this.has.background.color = true;\n this._el.container.className += ' tl-full-color-background';\n this.has.background.color_value = this.data.background.color;\n //this._el.container.style.backgroundColor = this.data.background.color;\n //this._el.background.style.backgroundColor \t= this.data.background.color;\n //this._el.background.style.display \t\t\t= \"block\";\n }\n if (this.data.background.text_background) {\n this._el.container.className += ' tl-text-background';\n }\n\n }\n\n\n\n // Determine Assets for layout and loading\n if (this.data.media && this.data.media.url && this.data.media.url != \"\") {\n this.has.media = true;\n }\n if (this.data.text && this.data.text.text) {\n this.has.text = true;\n }\n if (this.data.text && this.data.text.headline) {\n this.has.headline = true;\n }\n\n // Create Media\n if (this.has.media) {\n // Determine the media type\n this.data.media.mediatype = lookupMediaType(this.data.media);\n this.options.media_name = this.data.media.mediatype.name;\n this.options.media_type = this.data.media.mediatype.type;\n this.options.autolink = this.data.autolink;\n\n // Create a media object using the matched class name\n this._media = new this.data.media.mediatype.cls(this.data.media, this.options, this.getLanguage());\n }\n\n // Create Text\n if (this.has.text || this.has.headline) {\n this._text = new Text(this.data.text, { title: this.has.title, language: this.options.language, autolink: this.data.autolink });\n this._text.addDateText(this.getFormattedDate());\n }\n\n\n\n // Add to DOM\n if (!this.has.text && !this.has.headline && this.has.media) {\n addClass(this._el.container, 'tl-slide-media-only');\n this._media.addTo(this._el.content);\n } else if (this.has.headline && this.has.media && !this.has.text) {\n addClass(this._el.container, 'tl-slide-media-only');\n this._text.addTo(this._el.content);\n this._media.addTo(this._el.content);\n } else if (this.has.text && this.has.media) {\n this._media.addTo(this._el.content);\n this._text.addTo(this._el.content);\n } else if (this.has.text || this.has.headline) {\n addClass(this._el.container, 'tl-slide-text-only');\n this._text.addTo(this._el.content);\n }\n\n // Fire event that the slide is loaded\n this.onLoaded();\n\n }\n\n _initEvents() {\n\n }\n\n _updateBackgroundDisplay() {\n if (this._background_media && this._background_media._state.loaded) {\n this._el.background.style.backgroundImage = \"url('\" + this._background_media.getImageURL(this.options.width, this.options.height) + \"')\";\n }\n }\n\n}\nclassMixin(Slide, I18NMixins, Events, DOMMixins)","import Events from \"../core/Events\";\nimport { DOMMixins } from \"../dom/DOMMixins\";\nimport { classMixin, mergeData, unlinkify } from \"../core/Util\"\nimport * as DOM from \"../dom/DOM\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport * as Browser from \"../core/Browser\"\n\nexport class SlideNav {\n\t\n\tconstructor(data, options, add_to_container) {\n\t\t// DOM ELEMENTS\n\t\tthis._el = {\n\t\t\tcontainer: {},\n\t\t\tcontent_container: {},\n\t\t\ticon: {},\n\t\t\ttitle: {},\n\t\t\tdescription: {}\n\t\t};\n\t\n\t\t// Media Type\n\t\tthis.mediatype = {};\n\t\t\n\t\t// Data\n\t\tthis.data = {\n\t\t\ttitle: \"Navigation\",\n\t\t\tdescription: \"Description\",\n\t\t\tdate: \"Date\"\n\t\t};\n\t\n\t\t//Options\n\t\tthis.options = {\n\t\t\tdirection: \t\t\t\"previous\"\n\t\t};\n\t\n\t\tthis.animator = null;\n\t\t\n\t\t// Merge Data and Options\n\t\tmergeData(this.options, options);\n\t\tmergeData(this.data, data);\n\t\t\n\t\t\n\t\tthis._el.container = DOM.create(\"div\", \"tl-slidenav-\" + this.options.direction);\n\t\t\n\t\tif (Browser.mobile) {\n\t\t\tthis._el.container.setAttribute(\"ontouchstart\",\" \");\n\t\t}\n\t\t\n\t\tthis._initLayout();\n\t\tthis._initEvents();\n\t\t\n\t\tif (add_to_container) {\n\t\t\tadd_to_container.appendChild(this._el.container);\n\t\t};\n\t\t\n\t}\n\t\n\t/*\tUpdate Content\n\t================================================== */\n\tupdate(slide) {\n\t\tvar d = {\n\t\t\ttitle: \"\",\n\t\t\tdescription: \"\",\n\t\t\tdate: slide.getFormattedDate()\n\t\t};\n\t\t\n\t\tif (slide.data.text) {\n\t\t\tif (slide.data.text.headline) {\n\t\t\t\td.title = slide.data.text.headline;\n\t\t\t}\n\t\t}\n\n\t\tthis._update(d);\n\t}\n\t\n\t/*\tColor\n\t================================================== */\n\tsetColor(inverted) {\n\t\tif (inverted) {\n\t\t\tthis._el.content_container.className = 'tl-slidenav-content-container tl-slidenav-inverted';\n\t\t} else {\n\t\t\tthis._el.content_container.className = 'tl-slidenav-content-container';\n\t\t}\n\t}\n\t\n\t/*\tEvents\n\t================================================== */\n\t_onMouseClick() {\n\t\tthis.fire(\"clicked\", this.options);\n\t}\n\t\n\t/*\tPrivate Methods\n\t================================================== */\n\t_update(d) {\n\t\t// update data\n\t\tthis.data = mergeData(this.data, d);\n\t\t\n\t\t// Title\n\t\tthis._el.title.innerHTML = unlinkify(this.data.title);\n\t\t\n\t\t// Date\n\t\tthis._el.description.innerHTML\t= unlinkify(this.data.date);\n\t}\n\t\n\t_initLayout () {\n\t\t\n\t\t// Create Layout\n\t\tthis._el.content_container\t\t\t= DOM.create(\"div\", \"tl-slidenav-content-container\", this._el.container);\n\t\tthis._el.icon\t\t\t\t\t\t= DOM.create(\"div\", \"tl-slidenav-icon\", this._el.content_container);\n\t\tthis._el.title = DOM.create(\"div\", \"tl-slidenav-title\", this._el.content_container);\n\t\tthis._el.description = DOM.create(\"div\", \"tl-slidenav-description\", this._el.content_container);\n\t\t\n\t\tthis._el.icon.innerHTML\t\t\t\t= \" \"\n\t\t\n\t\tthis._update();\n\t}\n\t\n\t_initEvents () {\n\t\tDOMEvent.addListener(this._el.container, 'click', this._onMouseClick, this);\n\t}\n\t\n\t\n}\n\nclassMixin(SlideNav, DOMMixins, Events)\n","import { I18NMixins } from \"../language/I18NMixins\";\nimport Events from \"../core/Events\";\nimport { easeInOutQuint } from \"../animation/Ease\"\nimport { classMixin, mergeData, unique_ID, findArrayNumberByUniqueID, hexToRgb, trace } from \"../core/Util\"\nimport { Animate } from \"../animation/Animate\"\nimport * as DOM from \"../dom/DOM\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\nimport * as Browser from \"../core/Browser\"\nimport { addClass } from \"../dom/DOMUtil\"\nimport Swipable from \"../ui/Swipable\";\nimport Message from \"../ui/Message\"\nimport { Slide } from \"./Slide\"\nimport { SlideNav } from \"./SlideNav\"\n\nexport class StorySlider {\n constructor(elem, data, options, language) {\n\n if (language) {\n this.setLanguage(language)\n }\n\n // DOM ELEMENTS\n this._el = {\n container: {},\n background: {},\n slider_container_mask: {},\n slider_container: {},\n slider_item_container: {}\n };\n\n this._nav = {};\n this._nav.previous = {};\n this._nav.next = {};\n\n // Slide Spacing\n this.slide_spacing = 0;\n\n // Slides Array\n this._slides = [];\n\n // Swipe Object\n this._swipable;\n\n // Preload Timer\n this.preloadTimer;\n\n // Message\n this._message;\n\n // Current Slide\n this.current_id = '';\n\n // Data Object\n this.data = {};\n\n this.options = {\n id: \"\",\n layout: \"portrait\",\n width: 600,\n height: 600,\n default_bg_color: { r: 255, g: 255, b: 255 },\n slide_padding_lr: 40, // padding on slide of slide\n start_at_slide: 1,\n slide_default_fade: \"0%\", // landscape fade\n // animation\n duration: 1000,\n ease: easeInOutQuint,\n // interaction\n dragging: true,\n trackResize: true\n };\n\n // Main element ID\n if (typeof elem === 'object') {\n this._el.container = elem;\n this.options.id = unique_ID(6, \"tl\");\n } else {\n this.options.id = elem;\n this._el.container = DOM.get(elem);\n }\n\n if (!this._el.container.id) {\n this._el.container.id = this.options.id;\n }\n\n // Animation Object\n this.animator = null;\n\n // Merge Data and Options\n mergeData(this.options, options);\n mergeData(this.data, data);\n\n }\n\n init() {\n this._initLayout();\n this._initEvents();\n this._initData();\n this.updateDisplay();\n\n // Go to initial slide\n this.goTo(this.options.start_at_slide);\n\n this._onLoaded();\n }\n\n /* Slides\n ================================================== */\n _addSlide(slide) {\n slide.addTo(this._el.slider_item_container);\n slide.on('added', this._onSlideAdded, this);\n slide.on('background_change', this._onBackgroundChange, this);\n }\n\n _createSlide(d, title_slide, n) {\n var slide = new Slide(d, this.options, title_slide, this.getLanguage());\n this._addSlide(slide);\n if (n < 0) {\n this._slides.push(slide);\n } else {\n this._slides.splice(n, 0, slide);\n }\n }\n\n _createSlides(array) {\n for (var i = 0; i < array.length; i++) {\n if (array[i].unique_id == \"\") {\n array[i].unique_id = unique_ID(6, \"tl-slide\");\n }\n this._createSlide(array[i], false, -1);\n }\n }\n\n _removeSlide(slide) {\n slide.removeFrom(this._el.slider_item_container);\n slide.off('added', this._onSlideRemoved, this);\n slide.off('background_change', this._onBackgroundChange);\n }\n\n _destroySlide(n) {\n this._removeSlide(this._slides[n]);\n this._slides.splice(n, 1);\n }\n\n _findSlideIndex(n) {\n var _n = n;\n if (typeof n == 'string' || n instanceof String) {\n _n = findArrayNumberByUniqueID(n, this._slides, \"unique_id\");\n }\n return _n;\n }\n\n /*\tPublic\n ================================================== */\n updateDisplay(width, height, animate, layout) {\n var nav_pos, _layout;\n\n if (typeof layout === 'undefined') {\n _layout = this.options.layout;\n } else {\n _layout = layout;\n }\n\n this.options.layout = _layout;\n\n if (width) {\n this.options.width = width;\n } else {\n this.options.width = this._el.container.offsetWidth;\n }\n\n if (height) {\n this.options.height = height;\n } else {\n this.options.height = this._el.container.offsetHeight;\n }\n\n this.slide_spacing = this.options.width * 2;\n\n // position navigation\n nav_pos = (this.options.height / 2);\n this._nav.next.setPosition({ top: nav_pos });\n this._nav.previous.setPosition({ top: nav_pos });\n\n\n // Position slides\n for (var i = 0; i < this._slides.length; i++) {\n this._slides[i].updateDisplay(this.options.width, this.options.height, _layout);\n this._slides[i].setPosition({ left: (this.slide_spacing * i), top: 0 });\n\n };\n\n // Go to the current slide\n this.goToId(this.current_id, true, true);\n }\n\n\n // Create a slide\n createSlide(d, n) {\n this._createSlide(d, false, n);\n }\n\n // Create Many Slides from an array\n createSlides(array) {\n this._createSlides(array);\n }\n\n // Destroy slide by index\n destroySlide(n) {\n this._destroySlide(n);\n }\n\n // Destroy slide by id\n destroySlideId(id) {\n this.destroySlide(this._findSlideIndex(id));\n }\n\n /*\tNavigation\n ================================================== */\n goTo(n, fast, displayupdate) {\n n = parseInt(n);\n if (isNaN(n)) n = 0;\n\n var self = this;\n\n this.changeBackground({ color_value: \"\", image: false });\n\n // Clear Preloader Timer\n if (this.preloadTimer) {\n clearTimeout(this.preloadTimer);\n }\n\n // Set Slide Active State\n for (var i = 0; i < this._slides.length; i++) {\n this._slides[i].setActive(false);\n }\n\n if (n < this._slides.length && n >= 0) {\n this.current_id = this._slides[n].data.unique_id;\n\n // Stop animation\n if (this.animator) {\n this.animator.stop();\n }\n if (this._swipable) {\n this._swipable.stopMomentum();\n }\n\n if (fast) {\n this._el.slider_container.style.left = -(this.slide_spacing * n) + \"px\";\n this._onSlideChange(displayupdate);\n } else {\n this.animator = Animate(this._el.slider_container, {\n left: -(this.slide_spacing * n) + \"px\",\n duration: this.options.duration,\n easing: this.options.ease,\n complete: this._onSlideChange(displayupdate)\n });\n }\n\n // Set Slide Active State\n this._slides[n].setActive(true);\n\n // Update Navigation and Info\n if (this._slides[n + 1]) {\n this.showNav(this._nav.next, true);\n this._nav.next.update(this._slides[n + 1]);\n } else {\n this.showNav(this._nav.next, false);\n }\n if (this._slides[n - 1]) {\n this.showNav(this._nav.previous, true);\n this._nav.previous.update(this._slides[n - 1]);\n } else {\n this.showNav(this._nav.previous, false);\n }\n\n // Preload Slides\n this.preloadTimer = setTimeout(function() {\n self.preloadSlides(n);\n }, this.options.duration);\n }\n }\n\n goToId(id, fast, displayupdate) {\n this.goTo(this._findSlideIndex(id), fast, displayupdate);\n }\n\n preloadSlides(n) {\n if (this._slides[n + 1]) {\n this._slides[n + 1].loadMedia();\n this._slides[n + 1].scrollToTop();\n }\n if (this._slides[n + 2]) {\n this._slides[n + 2].loadMedia();\n this._slides[n + 2].scrollToTop();\n }\n if (this._slides[n - 1]) {\n this._slides[n - 1].loadMedia();\n this._slides[n - 1].scrollToTop();\n }\n if (this._slides[n - 2]) {\n this._slides[n - 2].loadMedia();\n this._slides[n - 2].scrollToTop();\n }\n }\n\n next() {\n var n = this._findSlideIndex(this.current_id);\n if ((n + 1) < (this._slides.length)) {\n this.goTo(n + 1);\n } else {\n this.goTo(n);\n }\n }\n\n previous() {\n var n = this._findSlideIndex(this.current_id);\n if (n - 1 >= 0) {\n this.goTo(n - 1);\n } else {\n this.goTo(n);\n }\n }\n\n showNav(nav_obj, show) {\n\n if (this.options.width <= 500 && Browser.mobile) {\n\n } else {\n if (show) {\n nav_obj.show();\n } else {\n nav_obj.hide();\n }\n\n }\n }\n\n\n\n changeBackground(bg) {\n var bg_color = { r: 256, g: 256, b: 256 },\n bg_color_rgb;\n\n if (bg.color_value && bg.color_value != \"\") {\n bg_color = hexToRgb(bg.color_value);\n if (!bg_color) {\n trace(\"Invalid color value \" + bg.color_value);\n bg_color = this.options.default_bg_color;\n }\n } else {\n bg_color = this.options.default_bg_color;\n bg.color_value = \"rgb(\" + bg_color.r + \" , \" + bg_color.g + \", \" + bg_color.b + \")\";\n }\n\n bg_color_rgb = bg_color.r + \",\" + bg_color.g + \",\" + bg_color.b;\n this._el.background.style.backgroundImage = \"none\";\n\n\n if (bg.color_value) {\n this._el.background.style.backgroundColor = bg.color_value;\n } else {\n this._el.background.style.backgroundColor = \"transparent\";\n }\n\n if (bg_color.r < 255 || bg_color.g < 255 || bg_color.b < 255 || bg.image) {\n this._nav.next.setColor(true);\n this._nav.previous.setColor(true);\n } else {\n this._nav.next.setColor(false);\n this._nav.previous.setColor(false);\n }\n }\n /*\tPrivate Methods\n ================================================== */\n\n // Update Display\n\n // Reposition and redraw slides\n _updateDrawSlides() {\n var _layout = this.options.layout;\n\n for (var i = 0; i < this._slides.length; i++) {\n this._slides[i].updateDisplay(this.options.width, this.options.height, _layout);\n this._slides[i].setPosition({ left: (this.slide_spacing * i), top: 0 });\n };\n\n this.goToId(this.current_id, true, false);\n }\n\n\n /*\tInit\n ================================================== */\n _initLayout() {\n\n addClass(this._el.container, 'tl-storyslider');\n\n // Create Layout\n this._el.slider_container_mask = DOM.create('div', 'tl-slider-container-mask', this._el.container);\n this._el.background = DOM.create('div', 'tl-slider-background tl-animate', this._el.container);\n this._el.slider_container = DOM.create('div', 'tl-slider-container tlanimate', this._el.slider_container_mask);\n this._el.slider_item_container = DOM.create('div', 'tl-slider-item-container', this._el.slider_container);\n\n\n // Update Size\n this.options.width = this._el.container.offsetWidth;\n this.options.height = this._el.container.offsetHeight;\n\n // Create Navigation\n this._nav.previous = new SlideNav({ title: \"Previous\", description: \"description\" }, { direction: \"previous\" });\n this._nav.next = new SlideNav({ title: \"Next\", description: \"description\" }, { direction: \"next\" });\n\n // add the navigation to the dom\n this._nav.next.addTo(this._el.container);\n this._nav.previous.addTo(this._el.container);\n\n\n\n this._el.slider_container.style.left = \"0px\";\n\n if (Browser.touch) {\n //this._el.slider_touch_mask = DOM.create('div', 'tl-slider-touch-mask', this._el.slider_container_mask);\n this._swipable = new Swipable(this._el.slider_container_mask, this._el.slider_container, {\n enable: { x: true, y: false },\n snap: true\n });\n this._swipable.enable();\n\n // Message\n this._message = new Message(this._el.container, {\n message_class: \"tl-message-full\",\n message_icon_class: \"tl-icon-swipe-left\"\n },\n this.getLanguage());\n this._message.updateMessage(this._(\"swipe_to_navigate\"));\n this._message.addTo(this._el.container);\n }\n\n }\n\n _initEvents() {\n this._nav.next.on('clicked', this._onNavigation, this);\n this._nav.previous.on('clicked', this._onNavigation, this);\n\n if (this._message) {\n this._message.on('clicked', this._onMessageClick, this);\n }\n\n if (this._swipable) {\n this._swipable.on('swipe_left', this._onNavigation, this);\n this._swipable.on('swipe_right', this._onNavigation, this);\n this._swipable.on('swipe_nodirection', this._onSwipeNoDirection, this);\n }\n\n\n }\n\n _initData() {\n if (this.data.title) {\n this._createSlide(this.data.title, true, -1);\n }\n this._createSlides(this.data.events);\n }\n\n /*\tEvents\n ================================================== */\n _onBackgroundChange(e) {\n var n = this._findSlideIndex(this.current_id);\n var slide_background = this._slides[n].getBackground();\n this.changeBackground(e);\n this.fire(\"colorchange\", slide_background);\n }\n\n _onMessageClick(e) {\n this._message.hide();\n }\n\n _onSwipeNoDirection(e) {\n this.goToId(this.current_id);\n }\n\n _onNavigation(e) {\n\n if (e.direction == \"next\" || e.direction == \"left\") {\n this.next();\n } else if (e.direction == \"previous\" || e.direction == \"right\") {\n this.previous();\n }\n this.fire(\"nav_\" + e.direction, this.data);\n }\n\n _onSlideAdded(e) {\n trace(\"slideadded\")\n this.fire(\"slideAdded\", this.data);\n }\n\n _onSlideRemoved(e) {\n this.fire(\"slideRemoved\", this.data);\n }\n\n _onSlideChange(displayupdate) {\n if (!displayupdate) {\n this.fire(\"change\", { unique_id: this.current_id });\n }\n }\n\n _onMouseClick(e) {\n\n }\n\n _fireMouseEvent(e) {\n if (!this._loaded) {\n return;\n }\n\n var type = e.type;\n type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\n\n if (!this.hasEventListeners(type)) {\n return;\n }\n\n if (type === 'contextmenu') {\n DOMEvent.preventDefault(e);\n }\n\n this.fire(type, {\n latlng: \"something\", //this.mouseEventToLatLng(e),\n layerPoint: \"something else\" //this.mouseEventToLayerPoint(e)\n });\n }\n\n _onLoaded() {\n this.fire(\"loaded\", this.data);\n }\n\n\n}\n\nclassMixin(StorySlider, I18NMixins, Events)","import * as DOM from \"../dom/DOM\"\nimport * as Browser from \"../core/Browser\"\nimport Events from \"../core/Events\";\nimport { DOMMixins } from \"../dom/DOMMixins\"\nimport { easeInOutQuint } from \"../animation/Ease\"\nimport { classMixin, mergeData } from \"../core/Util\"\nimport { addClass, removeClass } from \"../dom/DOMUtil\"\nimport { DOMEvent } from \"../dom/DOMEvent\"\n\nexport class MenuBar {\n\tconstructor(elem, parent_elem, options) {\n\t\t// DOM ELEMENTS\n\t\tthis._el = {\n\t\t\tparent: {},\n\t\t\tcontainer: {},\n\t\t\tbutton_backtostart: {},\n\t\t\tbutton_zoomin: {},\n\t\t\tbutton_zoomout: {},\n\t\t\tarrow: {},\n\t\t\tline: {},\n\t\t\tcoverbar: {},\n\t\t\tgrip: {}\n\t\t};\n\n\t\tthis.collapsed = false;\n\n\t\tif (typeof elem === 'object') {\n\t\t\tthis._el.container = elem;\n\t\t} else {\n\t\t\tthis._el.container = DOM.get(elem);\n\t\t}\n\n\t\tif (parent_elem) {\n\t\t\tthis._el.parent = parent_elem;\n\t\t}\n\n\t\t//Options\n\t\tthis.options = {\n\t\t\twidth: \t\t\t\t\t600,\n\t\t\theight: \t\t\t\t600,\n\t\t\tduration: \t\t\t\t1000,\n\t\t\tease: \t\t\t\t\teaseInOutQuint,\n\t\t\tmenubar_default_y: \t\t0\n\t\t};\n\n\t\t// Animation\n\t\tthis.animator = {};\n\n\t\t// Merge Data and Options\n\t\tmergeData(this.options, options);\n\n\t\tthis._initLayout();\n\t\tthis._initEvents();\n\t}\n\n\t/*\tPublic\n\t================================================== */\n\tshow(d) {\n\n\t\tvar duration = this.options.duration;\n\t\tif (d) {\n\t\t\tduration = d;\n\t\t}\n\t}\n\n\thide(top) {\n\t}\n\n\ttoogleZoomIn(show) {\n\t\tif (show) {\n removeClass(this._el.button_zoomin,'tl-menubar-button-inactive');\n\t\t} else {\n addClass(this._el.button_zoomin,'tl-menubar-button-inactive');\n\t\t}\n\t}\n\n\ttoogleZoomOut(show) {\n\t\tif (show) {\n removeClass(this._el.button_zoomout,'tl-menubar-button-inactive');\n\t\t} else {\n addClass(this._el.button_zoomout,'tl-menubar-button-inactive');\n\t\t}\n\t}\n\n\tsetSticky(y) {\n\t\tthis.options.menubar_default_y = y;\n\t}\n\n\t/*\tColor\n\t================================================== */\n\tsetColor(inverted) {\n\t\tif (inverted) {\n\t\t\tthis._el.container.className = 'tl-menubar tl-menubar-inverted';\n\t\t} else {\n\t\t\tthis._el.container.className = 'tl-menubar';\n\t\t}\n\t}\n\n\t/*\tUpdate Display\n\t================================================== */\n\tupdateDisplay(w, h, a, l) {\n\t\tthis._updateDisplay(w, h, a, l);\n\t}\n\n\n\t/*\tEvents\n\t================================================== */\n\t_onButtonZoomIn(e) {\n\t\tthis.fire(\"zoom_in\", e);\n\t}\n\n\t_onButtonZoomOut(e) {\n\t\tthis.fire(\"zoom_out\", e);\n\t}\n\n\t_onButtonBackToStart(e) {\n\t\tthis.fire(\"back_to_start\", e);\n\t}\n\n\n\t/*\tPrivate Methods\n\t================================================== */\n\t_initLayout () {\n\n\t\t// Create Layout\n\t\tthis._el.button_zoomin = DOM.create('span', 'tl-menubar-button', this._el.container);\n\t\tthis._el.button_zoomout = DOM.create('span', 'tl-menubar-button', this._el.container);\n\t\tthis._el.button_backtostart = DOM.create('span', 'tl-menubar-button', this._el.container);\n\n\t\tif (Browser.mobile) {\n\t\t\tthis._el.container.setAttribute(\"ontouchstart\",\" \");\n\t\t}\n\n\t\tthis._el.button_backtostart.innerHTML\t\t= \"<span class='tl-icon-goback'></span>\";\n\t\tthis._el.button_zoomin.innerHTML\t\t\t= \"<span class='tl-icon-zoom-in'></span>\";\n\t\tthis._el.button_zoomout.innerHTML\t\t\t= \"<span class='tl-icon-zoom-out'></span>\";\n\n\n\t}\n\n\t_initEvents () {\n\t\tDOMEvent.addListener(this._el.button_backtostart, 'click', this._onButtonBackToStart, this);\n\t\tDOMEvent.addListener(this._el.button_zoomin, 'click', this._onButtonZoomIn, this);\n\t\tDOMEvent.addListener(this._el.button_zoomout, 'click', this._onButtonZoomOut, this);\n\t}\n\n\t// Update Display\n\t_updateDisplay(width, height, animate) {\n\n\t\tif (width) {\n\t\t\tthis.options.width = width;\n\t\t}\n\t\tif (height) {\n\t\t\tthis.options.height = height;\n\t\t}\n\t}\n\n}\n\nclassMixin(MenuBar, DOMMixins, Events)\n","import * as DOM from \"../dom/DOM\"\nimport { addClass } from \"../dom/DOMUtil\"\nimport { hexToRgb, mergeData, classMixin, isTrue, trace, addTraceHandler } from \"../core/Util\";\nimport { easeInOutQuint, easeOutStrong } from \"../animation/Ease\";\nimport Message from \"../ui/Message\"\nimport { Language, fallback, loadLanguage } from \"../language/Language\"\nimport { I18NMixins } from \"../language/I18NMixins\";\nimport Events from \"../core/Events\";\nimport { makeConfig } from \"../core/ConfigFactory\"\nimport { TimelineConfig } from \"../core/TimelineConfig\"\nimport { TimeNav } from \"../timenav/TimeNav\"\nimport * as Browser from \"../core/Browser\"\nimport { Animate } from \"../animation/Animate\"\nimport { StorySlider } from \"../slider/StorySlider\"\nimport { MenuBar } from \"../ui/MenuBar\"\nimport { loadCSS, loadJS } from \"../core/Load\";\n\nlet script_src_url = null;\nif (document) {\n let script_tags = document.getElementsByTagName('script');\n if (script_tags && script_tags.length > 0) {\n script_src_url = script_tags[script_tags.length - 1].src;\n }\n}\n\nfunction make_keydown_handler(timeline) {\n return function(event) {\n if (timeline.config) {\n var keyName = event.key;\n var currentSlide = timeline._getSlideIndex(self.current_id);\n var _n = timeline.config.events.length - 1;\n var lastSlide = timeline.config.title ? _n + 1 : _n;\n var firstSlide = 0;\n\n if (keyName == 'ArrowLeft') {\n if (currentSlide != firstSlide) {\n timeline.goToPrev();\n }\n } else if (keyName == 'ArrowRight') {\n if (currentSlide != lastSlide) {\n timeline.goToNext();\n }\n }\n }\n }\n}\n\n/**\n * Primary entry point for using TimelineJS.\n * @constructor\n * @param {HTMLElement|string} elem - the HTML element, or its ID, to which \n * the Timeline should be bound\n * @param {object|String} - a JavaScript object conforming to the TimelineJS\n * configuration format, or a String which is the URL for a Google Sheets document\n * or JSON configuration file which Timeline will retrieve and parse into a JavaScript object.\n * NOTE: do not pass a JSON String for this. TimelineJS doesn't try to distinguish a \n * JSON string from a URL string. If you have a JSON String literal, parse it using\n * `JSON.parse` before passing it to the constructor.\n *\n * @param {object} [options] - a JavaScript object specifying \n * presentation options\n */\nclass Timeline {\n constructor(elem, data, options) {\n if (!options) {\n options = {}\n }\n this.ready = false;\n this._el = {\n container: DOM.get(elem),\n storyslider: {},\n timenav: {},\n menubar: {}\n };\n\n if (options.lang && !options.language) {\n options.language = options.lang;\n }\n\n /** @type {Language} */\n this.language = fallback;\n\n /** @type {StorySlider} */\n this._storyslider = {};\n\n /** @type {TimeNav} */\n this._timenav = {};\n\n /** @type {MenuBar} */\n this._menubar = {};\n\n // Loaded State\n this._loaded = { storyslider: false, timenav: false };\n\n /** @type {TimelineConfig} */\n this.config = null;\n\n this.options = {\n script_path: \"https://cdn.knightlab.com/libs/timeline3/latest/js/\", // as good a default as any\n height: this._el.container.offsetHeight,\n width: this._el.container.offsetWidth,\n debug: false,\n font: 'default',\n is_embed: false,\n is_full_embed: false,\n hash_bookmark: false,\n default_bg_color: { r: 255, g: 255, b: 255 },\n scale_factor: 2, // How many screen widths wide should the timeline be\n layout: \"landscape\", // portrait or landscape\n timenav_position: \"bottom\", // timeline on top or bottom\n optimal_tick_width: 60, // optimal distance (in pixels) between ticks on axis\n base_class: \"tl-timeline\", // removing tl-timeline will break all default stylesheets...\n timenav_height: null,\n timenav_height_percentage: 25, // Overrides timenav height as a percentage of the screen\n timenav_mobile_height_percentage: 40, // timenav height as a percentage on mobile devices\n timenav_height_min: 175, // Minimum timenav height\n marker_height_min: 30, // Minimum Marker Height\n marker_width_min: 100, // Minimum Marker Width\n marker_padding: 5, // Top Bottom Marker Padding\n start_at_slide: 0,\n start_at_end: false,\n menubar_height: 0,\n skinny_size: 650,\n medium_size: 800,\n use_bc: false, // Use declared suffix on dates earlier than 0\n // animation\n duration: 1000,\n ease: easeInOutQuint,\n // interaction\n dragging: true,\n trackResize: true,\n map_type: \"stamen:toner-lite\",\n slide_padding_lr: 100, // padding on slide of slide\n slide_default_fade: \"0%\", // landscape fade\n zoom_sequence: [0.5, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], // Array of Fibonacci numbers for TimeNav zoom levels\n language: \"en\",\n ga_property_id: null,\n track_events: ['back_to_start', 'nav_next', 'nav_previous', 'zoom_in', 'zoom_out'],\n theme: null,\n // sheets_proxy value should be suitable for simply postfixing with the Google Sheets CSV URL\n // as in include trailing slashes, or '?url=' or whatever. No support right now for anything but\n // postfixing. The default proxy should work in most cases, but only for TimelineJS sheets.\n sheets_proxy: 'https://sheets-proxy.knightlab.com/proxy/',\n soundcite: false,\n };\n\n // Animation Objects\n this.animator_timenav = null;\n this.animator_storyslider = null;\n this.animator_menubar = null;\n\n // Ideally we'd set the language here, but we're bootstrapping and may hit problems\n // before we're able to load it. if it weren't a remote resource, we could probably \n // do it.\n this.message = new Message(this._el.container, { message_class: \"tl-message-full\" });\n\n // Merge Options\n if (typeof(options.default_bg_color) == \"string\") {\n var parsed = hexToRgb(options.default_bg_color); // will clear it out if its invalid\n if (parsed) {\n options.default_bg_color = parsed;\n } else {\n delete options.default_bg_color\n trace(\"Invalid default background color. Ignoring.\");\n }\n }\n mergeData(this.options, options);\n\n if (!(this.options.script_path)) {\n this.options.script_path = this.determineScriptPath()\n }\n\n if (options.soundcite) {\n this.on('ready', () => {\n trace(\"Loading Soundcite resources \")\n loadCSS('https://cdn.knightlab.com/libs/soundcite/latest/css/player.css')\n loadJS('https://cdn.knightlab.com/libs/soundcite/latest/js/soundcite.min.js')\n })\n }\n\n // load font, theme\n this._loadStyles()\n\n\n document.addEventListener(\"keydown\", make_keydown_handler(this));\n window.addEventListener(\"resize\", function(e) {\n this.updateDisplay();\n }.bind(this));\n\n if (this.options.debug) {\n addTraceHandler(console.log)\n }\n\n // Apply base class to container\n addClass(this._el.container, 'tl-timeline');\n\n if (this.options.is_embed) {\n addClass(this._el.container, 'tl-timeline-embed');\n }\n\n if (this.options.is_full_embed) {\n addClass(this._el.container, 'tl-timeline-full-embed');\n }\n\n this._loadLanguage(data);\n\n }\n\n _loadStyles() {\n let font_css_url = null,\n theme_css_url = null;\n\n if (this.options.font && (\n this.options.font.indexOf('http') == 0 ||\n this.options.font.match(/\\.css$/))) {\n font_css_url = this.options.font\n } else if (this.options.font) {\n let fragment = '../css/fonts/font.' + this.options.font.toLowerCase() + '.css'\n font_css_url = new URL(fragment, this.options.script_path).toString()\n }\n\n if (font_css_url) {\n loadCSS(font_css_url)\n }\n\n if (this.options.theme && (\n this.options.theme.indexOf('http') == 0 ||\n this.options.theme.match(/\\.css$/))) {\n theme_css_url = this.options.theme\n } else if (this.options.theme) {\n let fragment = '../css/themes/timeline.theme.' + this.options.theme.toLowerCase() + '.css'\n theme_css_url = new URL(fragment, this.options.script_path).toString()\n }\n\n if (theme_css_url) {\n loadCSS(theme_css_url)\n }\n\n\n }\n\n\n _loadLanguage(data) {\n try {\n var lang = this.options.language\n var script_path = this.options.script_path\n loadLanguage(lang, script_path).then((language) => {\n if (language) {\n this.language = language\n this.message.setLanguage(this.language)\n this.options.language = this.language // easiest way to make language available to I18NMixins\n this.showMessage(this._('loading_timeline'))\n } else {\n this.showMessage(`Error loading ${lang}`) // but we will carry on using the fallback\n }\n this._initData(data)\n })\n } catch (e) {\n this.showMessage(this._translateError(e))\n }\n }\n\n /**\n * Initialize the data for this timeline. If data is a URL, pass it to ConfigFactory\n * to get a TimelineConfig; if data is a TimelineConfig, just use it; otherwise, \n * assume it's a JSON object in the right format, and wrap it in a new TimelineConfig.\n * @param {string|TimelineConfig|object} data\n */\n _initData(data) {\n if (typeof data == 'string') {\n makeConfig(data, {\n callback: function(config) {\n this.setConfig(config);\n }.bind(this),\n sheets_proxy: this.options.sheets_proxy\n });\n } else if (TimelineConfig == data.constructor) {\n this.setConfig(data);\n } else {\n this.setConfig(new TimelineConfig(data));\n }\n }\n\n /**\n * Given an input, if it is a Timeline Error object, look up the\n * appropriate error in the current language and return it, optionally \n * with detail that also comes in the object. Alternatively, pass back\n * the input, which is expected to be a string ready to display.\n * @param {Error|string} e - an Error object which can be localized, \n * or a string message\n */\n _translateError(e) {\n\n if (e.hasOwnProperty('stack')) {\n trace(e.stack);\n }\n if (e.message_key) {\n return this._(e.message_key) + (e.detail ? ' [' + e.detail + ']' : '')\n }\n return e;\n\n }\n\n /**\n * Display a message in the Timeline window.\n * @param {string} msg \n */\n showMessage(msg) {\n if (this.message) {\n this.message.updateMessage(msg);\n } else {\n trace(\"No message display available.\")\n trace(msg);\n }\n }\n /**\n * Not ideal, but if users don't specify the script path, we try to figure it out.\n * The script path is needed to load other languages\n */\n determineScriptPath() {\n let src = null;\n if (script_src_url) { // did we get it when this loaded?\n src = script_src_url;\n } else {\n let script_tag = document.getElementById('timeline-script-tag')\n if (script_tag) {\n src = script_tag.src\n }\n }\n\n if (!src) {\n let script_tags = document.getElementsByTagName('script');\n for (let index = script_tags.length - 1; index >= 0; index--) {\n if (script_tags[index].src) {\n src = script_tags[index].src\n break // if we haven't found anything else, use the latest loaded script\n }\n }\n }\n\n if (src) {\n // +1 to include the trailing slash or concatting for dynamic CSS load won't work.\n return src.substr(0, src.lastIndexOf('/') + 1);\n }\n return '';\n }\n\n\n setConfig(config) {\n this.config = config;\n if (this.config.isValid()) {\n // don't validate if it's already problematic to avoid clutter\n this.config.validate();\n this._validateOptions();\n }\n if (this.config.isValid()) {\n try {\n if (document.readyState === 'loading') { // Loading hasn't finished yet\n document.addEventListener('DOMContentLoaded', this._onDataLoaded.bind(this));\n } else {\n this._onDataLoaded();\n }\n } catch (e) {\n this.showMessage(\"<strong>\" + this._('error') + \":</strong> \" + this._translateError(e));\n }\n } else {\n var translated_errs = [];\n\n for (var i = 0, errs = this.config.getErrors(); i < errs.length; i++) {\n translated_errs.push(this._translateError(errs[i]));\n }\n\n this.showMessage(\"<strong>\" + this._('error') + \":</strong> \" + translated_errs.join('<br>'));\n // should we set 'self.ready'? if not, it won't resize,\n // but most resizing would only work\n // if more setup happens\n }\n }\n\n _onDataLoaded() {\n this.fire(\"dataloaded\");\n this._initLayout();\n this._initEvents();\n this._initAnalytics();\n if (this.message) {\n this.message.hide();\n }\n let callback = (entries, observer) => {\n if (entries.reduce((accum, curr) => accum || curr.isIntersecting, false)) {\n this.updateDisplay()\n }\n }\n let observer = new IntersectionObserver(callback.bind(this))\n observer.observe(this._el.container)\n this.ready = true;\n this.fire(\"ready\")\n\n }\n\n _initLayout() {\n var self = this;\n\n this.message.removeFrom(this._el.container);\n this._el.container.innerHTML = \"\";\n\n // Create Layout\n if (this.options.timenav_position == \"top\") {\n this._el.timenav = DOM.create('div', 'tl-timenav', this._el.container);\n this._el.storyslider = DOM.create('div', 'tl-storyslider', this._el.container);\n } else {\n this._el.storyslider = DOM.create('div', 'tl-storyslider', this._el.container);\n this._el.timenav = DOM.create('div', 'tl-timenav', this._el.container);\n }\n\n this._el.menubar = DOM.create('div', 'tl-menubar', this._el.container);\n\n\n // Initial Default Layout\n this.options.width = this._el.container.offsetWidth;\n this.options.height = this._el.container.offsetHeight;\n // this._el.storyslider.style.top = \"1px\";\n\n // Set TimeNav Height\n this.options.timenav_height = this._calculateTimeNavHeight(this.options.timenav_height);\n\n // Create TimeNav\n this._timenav = new TimeNav(this._el.timenav, this.config, this.options, this.language);\n this._timenav.on('loaded', this._onTimeNavLoaded, this);\n this._timenav.options.height = this.options.timenav_height;\n this._timenav.init();\n\n // intial_zoom cannot be applied before the timenav has been created\n if (this.options.initial_zoom) {\n // at this point, this.options refers to the merged set of options\n this.setZoom(this.options.initial_zoom);\n }\n\n // Create StorySlider\n this._storyslider = new StorySlider(this._el.storyslider, this.config, this.options, this.language);\n this._storyslider.on('loaded', this._onStorySliderLoaded, this);\n this._storyslider.init();\n\n // Create Menu Bar\n this._menubar = new MenuBar(this._el.menubar, this._el.container, this.options);\n\n // LAYOUT\n if (this.options.layout == \"portrait\") {\n this.options.storyslider_height = (this.options.height - this.options.timenav_height - 1);\n } else {\n this.options.storyslider_height = (this.options.height - 1);\n }\n\n\n // Update Display\n this._updateDisplay(this._timenav.options.height, true, 2000);\n\n }\n\n _initEvents() {\n // TimeNav Events\n this._timenav.on('change', this._onTimeNavChange, this);\n this._timenav.on('zoomtoggle', this._onZoomToggle, this);\n\n // StorySlider Events\n this._storyslider.on('change', this._onSlideChange, this);\n this._storyslider.on('colorchange', this._onColorChange, this);\n this._storyslider.on('nav_next', this._onStorySliderNext, this);\n this._storyslider.on('nav_previous', this._onStorySliderPrevious, this);\n\n // Menubar Events\n this._menubar.on('zoom_in', this._onZoomIn, this);\n this._menubar.on('zoom_out', this._onZoomOut, this);\n this._menubar.on('back_to_start', this._onBackToStart, this);\n\n }\n\n _onColorChange(e) {\n this.fire(\"color_change\", { unique_id: this.current_id }, this);\n }\n\n _onSlideChange(e) {\n if (this.current_id != e.unique_id) {\n this.current_id = e.unique_id;\n this._timenav.goToId(this.current_id);\n this._onChange(e);\n }\n }\n\n _onTimeNavChange(e) {\n if (this.current_id != e.unique_id) {\n this.current_id = e.unique_id;\n this._storyslider.goToId(this.current_id);\n this._onChange(e);\n }\n }\n\n _onZoomToggle(e) {\n if (e.zoom == \"in\") {\n this._menubar.toogleZoomIn(e.show);\n } else if (e.zoom == \"out\") {\n this._menubar.toogleZoomOut(e.show);\n }\n\n }\n\n\n\n _onChange(e) {\n this.fire(\"change\", { unique_id: this.current_id }, this);\n if (this.options.hash_bookmark && this.current_id) {\n this._updateHashBookmark(this.current_id);\n }\n }\n\n _onBackToStart(e) {\n this._storyslider.goTo(0);\n this.fire(\"back_to_start\", { unique_id: this.current_id }, this);\n }\n\n _onZoomIn(e) {\n this._timenav.zoomIn();\n this.fire(\"zoom_in\", { zoom_level: this._timenav.options.scale_factor }, this);\n }\n\n _onZoomOut(e) {\n this._timenav.zoomOut();\n this.fire(\"zoom_out\", { zoom_level: this._timenav.options.scale_factor }, this);\n }\n\n _onTimeNavLoaded() {\n this._loaded.timenav = true;\n this._onLoaded();\n }\n\n _onStorySliderLoaded() {\n this._loaded.storyslider = true;\n this._onLoaded();\n }\n\n _onStorySliderNext(e) {\n this.fire(\"nav_next\", e);\n }\n\n _onStorySliderPrevious(e) {\n this.fire(\"nav_previous\", e);\n }\n\n\n _updateDisplay(timenav_height, animate, d) {\n var duration = this.options.duration,\n display_class = this.options.base_class,\n menu_position = 0,\n self = this;\n\n if (d) {\n duration = d;\n }\n\n // Update width and height\n this.options.width = this._el.container.offsetWidth;\n this.options.height = this._el.container.offsetHeight;\n\n // Check if skinny\n if (this.options.width <= this.options.skinny_size) {\n display_class += \" tl-skinny\";\n this.options.layout = \"portrait\";\n } else if (this.options.width <= this.options.medium_size) {\n display_class += \" tl-medium\";\n this.options.layout = \"landscape\";\n } else {\n this.options.layout = \"landscape\";\n }\n\n // Detect Mobile and Update Orientation on Touch devices\n if (Browser.touch) {\n this.options.layout = Browser.orientation();\n }\n\n if (Browser.mobile) {\n display_class += \" tl-mobile\";\n // Set TimeNav Height\n this.options.timenav_height = this._calculateTimeNavHeight(timenav_height, this.options.timenav_mobile_height_percentage);\n } else {\n // Set TimeNav Height\n this.options.timenav_height = this._calculateTimeNavHeight(timenav_height);\n }\n\n // LAYOUT\n if (this.options.layout == \"portrait\") {\n // Portrait\n display_class += \" tl-layout-portrait\";\n\n } else {\n // Landscape\n display_class += \" tl-layout-landscape\";\n\n }\n\n // Set StorySlider Height\n this.options.storyslider_height = (this.options.height - this.options.timenav_height);\n\n // Positon Menu\n if (this.options.timenav_position == \"top\") {\n menu_position = (Math.ceil(this.options.timenav_height) / 2) - (this._el.menubar.offsetHeight / 2) - (39 / 2);\n } else {\n menu_position = Math.round(this.options.storyslider_height + 1 + (Math.ceil(this.options.timenav_height) / 2) - (this._el.menubar.offsetHeight / 2) - (35 / 2));\n }\n\n\n if (animate) {\n\n this._el.timenav.style.height = Math.ceil(this.options.timenav_height) + \"px\";\n\n // Animate StorySlider\n if (this.animator_storyslider) {\n this.animator_storyslider.stop();\n }\n this.animator_storyslider = Animate(this._el.storyslider, {\n height: this.options.storyslider_height + \"px\",\n duration: duration / 2,\n easing: easeOutStrong\n });\n\n // Animate Menubar\n if (this.animator_menubar) {\n this.animator_menubar.stop();\n }\n\n this.animator_menubar = Animate(this._el.menubar, {\n top: menu_position + \"px\",\n duration: duration / 2,\n easing: easeOutStrong\n });\n\n } else {\n // TimeNav\n this._el.timenav.style.height = Math.ceil(this.options.timenav_height) + \"px\";\n\n // StorySlider\n this._el.storyslider.style.height = this.options.storyslider_height + \"px\";\n\n // Menubar\n this._el.menubar.style.top = menu_position + \"px\";\n }\n\n if (this.message) {\n this.message.updateDisplay(this.options.width, this.options.height);\n }\n // Update Component Displays\n this._timenav.updateDisplay(this.options.width, this.options.timenav_height, animate);\n this._storyslider.updateDisplay(this.options.width, this.options.storyslider_height, animate, this.options.layout);\n\n if (this.options.language.direction == 'rtl') {\n display_class += ' tl-rtl';\n }\n\n\n // Apply class\n this._el.container.className = display_class;\n\n }\n\n /**\n * Compute the height of the navigation section of the Timeline, taking \n * into account the possibility of an explicit height or height \n * percentage, but also honoring the `timenav_height_min` option \n * value. If `timenav_height` is specified it takes precedence over \n * `timenav_height_percentage` but in either case, if the resultant \n * pixel height is less than `options.timenav_height_min` then the \n * value of `options.timenav_height_min` will be returned. (A minor \n * adjustment is made to the returned value to account for marker \n * padding.)\n * \n * @param {number} [timenav_height] - an integer value for the desired height in pixels\n * @param {number} [timenav_height_percentage] - an integer between 1 and 100\n */\n _calculateTimeNavHeight(timenav_height, timenav_height_percentage) {\n\n var height = 0;\n\n if (timenav_height) {\n height = timenav_height;\n } else {\n if (this.options.timenav_height_percentage || timenav_height_percentage) {\n if (timenav_height_percentage) {\n height = Math.round((this.options.height / 100) * timenav_height_percentage);\n } else {\n height = Math.round((this.options.height / 100) * this.options.timenav_height_percentage);\n }\n\n }\n }\n\n // Set new minimum based on how many rows needed\n if (this._timenav.ready) {\n if (this.options.timenav_height_min < this._timenav.getMinimumHeight()) {\n this.options.timenav_height_min = this._timenav.getMinimumHeight();\n }\n }\n\n // If height is less than minimum set it to minimum\n if (height < this.options.timenav_height_min) {\n height = this.options.timenav_height_min;\n }\n\n height = height - (this.options.marker_padding * 2);\n\n return height;\n }\n\n _validateOptions() {\n // assumes that this.options and this.config have been set.\n var INTEGER_PROPERTIES = ['timenav_height', 'timenav_height_min', 'marker_height_min', 'marker_width_min', 'marker_padding', 'start_at_slide', 'slide_padding_lr'];\n\n for (var i = 0; i < INTEGER_PROPERTIES.length; i++) {\n var opt = INTEGER_PROPERTIES[i];\n var value = this.options[opt];\n let valid = true;\n if (typeof(value) == 'number') {\n valid = (value == parseInt(value))\n } else if (typeof(value) == \"string\") {\n valid = (value.match(/^\\s*(\\-?\\d+)?\\s*$/));\n }\n if (!valid) {\n this.config.logError({ message_key: 'invalid_integer_option', detail: opt });\n }\n }\n }\n\n /**\n * Given a slide identifier, return the zero-based positional index of\n * that slide. If this timeline has a 'title' slide, it is at position 0\n * and all other slides are numbered after that. If there is no 'title' \n * slide, then the first event slide is at position 0.\n * @param {String} id \n */\n _getSlideIndex(id) {\n if (this.config) {\n if (this.config.title && this.config.title.unique_id == id) {\n return 0;\n }\n for (var i = 0; i < this.config.events.length; i++) {\n if (id == this.config.events[i].unique_id) {\n return this.config.title ? i + 1 : i;\n }\n }\n }\n return -1;\n }\n\n /**\n * Given a slide identifier, return the zero-based positional index of that slide.\n * Does not take the existence of a 'title' slide into account, so if there is a title\n * slide, this value should be one less than calling `_getSlideIndex` with the same\n * identifier. If there is no title slide, `_getSlideIndex` and `_getEventIndex` \n * should return the same value.\n * TODO: does it really make sense to have both `_getSlideIndex` and `_getEventIndex`?\n * @param {String} id \n */\n _getEventIndex(id) {\n for (var i = 0; i < this.config.events.length; i++) {\n if (id == this.config.events[i].unique_id) {\n return i;\n }\n }\n return -1;\n }\n\n _onLoaded() {\n if (this._loaded.storyslider && this._loaded.timenav) {\n this.fire(\"loaded\", this.config);\n // Go to proper slide\n if (isTrue(this.options.start_at_end) || this.options.start_at_slide > this.config.events.length) {\n this.goToEnd();\n } else {\n this.goTo(this.options.start_at_slide);\n }\n if (this.options.hash_bookmark) {\n if (window.location.hash != \"\") {\n this.goToId(window.location.hash.replace(\"#event-\", \"\"));\n } else {\n this._updateHashBookmark(this.current_id);\n }\n let the_timeline = this;\n window.addEventListener('hashchange', function() {\n if (window.location.hash.indexOf('#event-') == 0) {\n the_timeline.goToId(window.location.hash.replace(\"#event-\", \"\"));\n }\n }, false);\n }\n\n }\n }\n\n // Update hashbookmark in the url bar\n _updateHashBookmark(id) {\n if (id) { // TODO: validate the id...\n var hash = \"#\" + \"event-\" + id.toString();\n window.history.replaceState(null, \"Browsing TimelineJS\", hash);\n this.fire(\"hash_updated\", { unique_id: this.current_id, hashbookmark: \"#\" + \"event-\" + id.toString() }, this);\n }\n }\n\n\n /*\n PUBLIC API\n This has been minimally tested since most people use TimelineJS as an embed.\n If we hear from people who are trying to use TimelineJS this way, we will do\n what we can to make sure it works correctly, and will appreciate help!\n */\n zoomIn() {\n this._timenav.zoomIn();\n }\n\n zoomOut() {\n this._timenav.zoomOut();\n }\n\n setZoom(level) {\n this._timenav.setZoom(level);\n }\n\n // Goto slide with id\n goToId(id) {\n if (this.current_id != id) {\n\n this.current_id = id;\n this._timenav.goToId(this.current_id);\n this._storyslider.goToId(this.current_id, false, true);\n this.fire(\"change\", { unique_id: this.current_id }, this);\n }\n }\n\n // Goto slide n\n goTo(n) {\n if (this.config.title) {\n if (n == 0) {\n this.goToId(this.config.title.unique_id);\n } else {\n this.goToId(this.config.events[n - 1].unique_id);\n }\n } else {\n this.goToId(this.config.events[n].unique_id);\n }\n }\n\n // Goto first slide\n goToStart() {\n this.goTo(0);\n }\n\n // Goto last slide\n goToEnd() {\n var _n = this.config.events.length - 1;\n this.goTo(this.config.title ? _n + 1 : _n);\n }\n\n // Goto previous slide\n goToPrev() {\n this.goTo(this._getSlideIndex(this.current_id) - 1);\n }\n\n // Goto next slide\n goToNext() {\n this.goTo(this._getSlideIndex(this.current_id) + 1);\n }\n\n /* Event manipulation\n ================================================== */\n\n // Add an event\n add(data) {\n var unique_id = this.config.addEvent(data);\n\n var n = this._getEventIndex(unique_id);\n var d = this.config.events[n];\n\n this._storyslider.createSlide(d, this.config.title ? n + 1 : n);\n this._storyslider._updateDrawSlides();\n\n this._timenav.createMarker(d, n);\n this._timenav._updateDrawTimeline(false);\n\n this.fire(\"added\", { unique_id: unique_id });\n }\n\n // Remove an event\n remove(n) {\n if (n >= 0 && n < this.config.events.length) {\n // If removing the current, nav to new one first\n if (this.config.events[n].unique_id == this.current_id) {\n if (n < this.config.events.length - 1) {\n this.goTo(n + 1);\n } else {\n this.goTo(n - 1);\n }\n }\n\n var event = this.config.events.splice(n, 1);\n delete this.config.event_dict[event[0].unique_id];\n this._storyslider.destroySlide(this.config.title ? n + 1 : n);\n this._storyslider._updateDrawSlides();\n\n this._timenav.destroyMarker(n);\n this._timenav._updateDrawTimeline(false);\n\n this.fire(\"removed\", { unique_id: event[0].unique_id });\n }\n }\n\n removeId(id) {\n this.remove(this._getEventIndex(id));\n }\n\n /* Get slide data\n ================================================== */\n\n getData(n) {\n if (this.config.title) {\n if (n == 0) {\n return this.config.title;\n } else if (n > 0 && n <= this.config.events.length) {\n return this.config.events[n - 1];\n }\n } else if (n >= 0 && n < this.config.events.length) {\n return this.config.events[n];\n }\n return null;\n }\n\n getDataById(id) {\n return this.getData(this._getSlideIndex(id));\n }\n\n /* Get slide object\n ================================================== */\n\n getSlide(n) {\n if (n >= 0 && n < this._storyslider._slides.length) {\n return this._storyslider._slides[n];\n }\n return null;\n }\n\n getSlideById(id) {\n return this.getSlide(this._getSlideIndex(id));\n }\n\n getCurrentSlide() {\n return this.getSlideById(this.current_id);\n }\n\n updateDisplay() {\n if (this.ready) {\n this._updateDisplay();\n } else {\n trace('updateDisplay called but timeline is not in ready state')\n }\n }\n\n _initGoogleAnalytics() {\n (function(i, s, o, g, r, a, m) {\n i['GoogleAnalyticsObject'] = r;\n i[r] = i[r] || function() {\n (i[r].q = i[r].q || []).push(arguments)\n }, i[r].l = 1 * new Date();\n a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m)\n })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\n\n ga('create', this.options.ga_property_id, 'auto');\n ga('set', 'anonymizeIp', true);\n }\n\n _initAnalytics() {\n if (this.options.ga_property_id === null) { return; }\n this._initGoogleAnalytics();\n ga('send', 'pageview');\n var events = this.options.track_events;\n for (let i = 0; i < events.length; i++) {\n var event_ = events[i];\n this.addEventListener(event_, function(e) {\n ga('send', 'event', e.type, 'clicked');\n });\n }\n }\n\n\n}\n\nclassMixin(Timeline, I18NMixins, Events)\n\nexport { Timeline }\n"],"sourceRoot":""}