import { classMixin, mergeData, linkify, trace, } from "../core/Util"
import { I18NMixins } from "../language/I18NMixins";
import Events from "../core/Events"
import * as DOM from "../dom/DOM"
import * as Browser from "../core/Browser"
import { Text } from "./types/Text"
import Message from "../ui/Message"
class Media {
constructor(data, options, language) { //add_to_container) {
if (language) {
this.setLanguage(language)
}
// DOM ELEMENTS
this._el = {
container: {},
content_container: {},
content: {},
content_item: {},
content_link: {},
caption: null,
credit: null,
parent: {},
link: null
};
// Player (If Needed)
this.player = null;
// Timer (If Needed)
this.timer = null;
this.load_timer = null;
// Message
this.message = null;
// Media ID
this.media_id = null;
// State
this._state = {
loaded: false,
show_meta: false,
media_loaded: false
};
// Data
this.data = {
unique_id: null,
url: null,
credit: null,
caption: null,
credit_alternate: null,
caption_alternate: null,
link: null,
link_target: null
};
//Options
this.options = {
api_key_flickr: "bd3a7c45ddd52f3101825d41563a6125",
api_key_googlemaps: "AIzaSyB9dW8e_iRrATFa8g24qB6BDBGdkrLDZYI",
api_key_embedly: "", // ae2da610d1454b66abdf2e6a4c44026d
credit_height: 0,
caption_height: 0,
background: 0 // is background media (for slide)
};
this.animator = {};
// Merge Data and Options
mergeData(this.options, options);
mergeData(this.data, data);
// Don't create DOM elements if this is background media
if (!this.options.background) {
this._el.container = DOM.create("div", "tl-media");
if (this.data.unique_id) {
this._el.container.id = this.data.unique_id;
}
this._initLayout();
}
}
loadMedia() {
var self = this;
if (!this._state.loaded) {
try {
this.load_timer = setTimeout(function() {
self.loadingMessage();
self._loadMedia();
// self._state.loaded = true; handled in onLoaded()
self._updateDisplay();
}, 1200);
} catch (e) {
trace("Error loading media for ", this._media);
trace(e);
}
}
}
_updateMessage(msg) {
if (this.message) {
this.message.updateMessage(msg);
}
}
loadingMessage() {
this._updateMessage(this._('loading') + " " + this.options.media_name);
}
errorMessage(msg) {
if (msg) {
msg = this._('error') + ": " + msg;
} else {
msg = this._('error');
}
this._updateMessage(msg);
}
updateMediaDisplay(layout) {
if (this._state.loaded && !this.options.background) {
if (Browser.mobile) {
this._el.content_item.style.maxHeight = (this.options.height / 2) + "px";
} else {
this._el.content_item.style.maxHeight = this.options.height - this.options.credit_height - this.options.caption_height - 30 + "px";
}
//this._el.content_item.style.maxWidth = this.options.width + "px";
this._el.container.style.maxWidth = this.options.width + "px";
// Fix for max-width issues in Firefox
if (Browser.firefox) {
if (this._el.content_item.offsetWidth > this._el.content_item.offsetHeight) {
//this._el.content_item.style.width = "100%";
}
}
this._updateMediaDisplay(layout);
if (this._state.media_loaded) {
if (this._el.credit) {
this._el.credit.style.width = this._el.content_item.offsetWidth + "px";
}
if (this._el.caption) {
this._el.caption.style.width = this._el.content_item.offsetWidth + "px";
}
}
}
}
/* Media Specific
================================================== */
_loadMedia() {
// All overrides must call this.onLoaded() to set state
this.onLoaded();
}
_updateMediaDisplay(l) {
//this._el.content_item.style.maxHeight = (this.options.height - this.options.credit_height - this.options.caption_height - 16) + "px";
if (Browser.firefox) {
this._el.content_item.style.maxWidth = this.options.width + "px";
this._el.content_item.style.width = "auto";
}
}
_getMeta() {
}
_getImageURL(w, h) {
// Image-based media types should return -compatible src url
return "";
}
/* Public
================================================== */
show() {
}
hide() {
}
addTo(container) {
container.appendChild(this._el.container);
this.onAdd();
}
removeFrom(container) {
container.removeChild(this._el.container);
this.onRemove();
}
getImageURL(w, h) {
return this._getImageURL(w, h);
}
// Update Display
updateDisplay(w, h, l) {
this._updateDisplay(w, h, l);
}
stopMedia() {
try {
this._stopMedia();
} catch (e) {
trace(`stopMedia() exception: ${e}`)
}
}
loadErrorDisplay(message) {
try {
this._el.content.removeChild(this._el.content_item);
} catch (e) {
// if this._el.content_item isn't a child of this._el then just keep truckin
}
this._el.content_item = DOM.create("div", "tl-media-item tl-media-loaderror", this._el.content);
this._el.content_item.innerHTML = "
" + message + "
"; // After Loaded this.onLoaded(true); } /* Events ================================================== */ onLoaded(error) { this._state.loaded = true; this.fire("loaded", this.data); if (this.message) { this.message.hide(); } if (!(error || this.options.background)) { this.showMeta(); } this.updateDisplay(); } onMediaLoaded(e) { this._state.media_loaded = true; this.fire("media_loaded", this.data); if (this._el.credit) { this._el.credit.style.width = this._el.content_item.offsetWidth + "px"; } if (this._el.caption) { this._el.caption.style.width = this._el.content_item.offsetWidth + "px"; } } showMeta(credit, caption) { this._state.show_meta = true; // Credit if (this.data.credit && this.data.credit != "") { this._el.credit = DOM.create("div", "tl-credit", this._el.content_container); this._el.credit.innerHTML = this.options.autolink == true ? linkify(this.data.credit) : this.data.credit; this.options.credit_height = this._el.credit.offsetHeight; } // Caption if (this.data.caption && this.data.caption != "") { this._el.caption = DOM.create("div", "tl-caption", this._el.content_container); this._el.caption.innerHTML = this.options.autolink == true ? linkify(this.data.caption) : this.data.caption; this.options.caption_height = this._el.caption.offsetHeight; } if (!this.data.caption || !this.data.credit) { this.getMeta(); } } getMeta() { this._getMeta(); } updateMeta() { if (!this.data.credit && this.data.credit_alternate) { this._el.credit = DOM.create("div", "tl-credit", this._el.content_container); this._el.credit.innerHTML = this.data.credit_alternate; this.options.credit_height = this._el.credit.offsetHeight; } if (!this.data.caption && this.data.caption_alternate) { this._el.caption = DOM.create("div", "tl-caption", this._el.content_container); this._el.caption.innerHTML = this.data.caption_alternate; this.options.caption_height = this._el.caption.offsetHeight; } this.updateDisplay(); } onAdd() { this.fire("added", this.data); } onRemove() { this.fire("removed", this.data); } /* Private Methods ================================================== */ _initLayout() { // Message this.message = new Message(this._el.container, this.options, this.getLanguage()); // this.message.addTo(this._el.container); // Create Layout this._el.content_container = DOM.create("div", "tl-media-content-container", this._el.container); // Link if (this.data.link && this.data.link != "") { this._el.link = DOM.create("a", "tl-media-link", this._el.content_container); this._el.link.href = this.data.link; if (this.data.link_target && this.data.link_target != "") { this._el.link.target = this.data.link_target; } else { this._el.link.target = "_blank"; } if (this._el.link.target == '_blank') { this._el.link.setAttribute('rel', 'noopener'); } this._el.content = DOM.create("div", "tl-media-content", this._el.link); } else { this._el.content = DOM.create("div", "tl-media-content", this._el.content_container); } } // Update Display _updateDisplay(w, h, l) { if (w) { this.options.width = w; } //this._el.container.style.width = this.options.width + "px"; if (h) { this.options.height = h; } if (l) { this.options.layout = l; } if (this._el.credit) { this.options.credit_height = this._el.credit.offsetHeight; } if (this._el.caption) { this.options.caption_height = this._el.caption.offsetHeight + 5; } this.updateMediaDisplay(this.options.layout); } domCreate(...params) { return DOM.create(...params) } _stopMedia() { } } classMixin(Media, Events, I18NMixins) export { Media, Text }