From 0f7f9aebe77e30b82cb4e1197a5c042d8252dacc Mon Sep 17 00:00:00 2001 From: Zach Wise Date: Mon, 11 Jun 2012 11:02:46 -0500 Subject: [PATCH] External API enhancements closes #147 and closes #148 --- source/js/Core/VMM.Library.js | 5 +- source/js/Core/VMM.js | 28 ++- source/js/Media/VMM.ExternalAPI.js | 301 +++++++++++++++++++++------ source/js/Media/VMM.MediaElement.js | 33 ++- source/js/Media/VMM.MediaType.js | 10 +- source/js/Slider/VMM.Slider.Slide.js | 2 +- 6 files changed, 292 insertions(+), 87 deletions(-) diff --git a/source/js/Core/VMM.Library.js b/source/js/Core/VMM.Library.js index bad186a..1a9034e 100644 --- a/source/js/Core/VMM.Library.js +++ b/source/js/Core/VMM.Library.js @@ -100,7 +100,9 @@ if(typeof VMM != 'undefined') { VMM.getJSON = function(url, data, callback) { if( typeof( jQuery ) != 'undefined' ){ - + jQuery.ajaxSetup({ + timeout: 3000 + }); /* CHECK FOR IE ================================================== */ if ( VMM.Browser.browser == "Explorer" && parseInt(VMM.Browser.version, 10) >= 7 && window.XDomainRequest) { @@ -117,6 +119,7 @@ if(typeof VMM != 'undefined') { } else { return jQuery.getJSON(url, data, callback); + } } } diff --git a/source/js/Core/VMM.js b/source/js/Core/VMM.js index 231c1fb..9d5a3f4 100644 --- a/source/js/Core/VMM.js +++ b/source/js/Core/VMM.js @@ -118,6 +118,22 @@ if (typeof VMM == 'undefined') { twitter: "" }, + timers: { + api: 7000 + }, + + api: { + pushques: [], + + }, + + twitter: { + active: false, + array: [], + api_loaded: false, + que: [] + }, + flickr: { active: false, array: [], @@ -166,7 +182,8 @@ if (typeof VMM == 'undefined') { active: false, array: [], api_loaded: false, - que: [] + que: [], + tries: 0 }, soundcloud: { @@ -294,6 +311,15 @@ function trace( msg ) { } } +/* Array Remove - By John Resig (MIT Licensed) + http://ejohn.org/blog/javascript-array-remove/ +================================================== */ +Array.prototype.remove = function(from, to) { + var rest = this.slice((to || from) + 1 || this.length); + this.length = from < 0 ? this.length + from : from; + return this.push.apply(this, rest); +} + /* Extending Date to include Week ================================================== */ Date.prototype.getWeek = function() { diff --git a/source/js/Media/VMM.ExternalAPI.js b/source/js/Media/VMM.ExternalAPI.js index 0a4ea1a..d4ad1da 100644 --- a/source/js/Media/VMM.ExternalAPI.js +++ b/source/js/Media/VMM.ExternalAPI.js @@ -27,12 +27,107 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { if (VMM.master_config.vimeo.active) { VMM.ExternalAPI.vimeo.pushQue(); } - + if (VMM.master_config.twitter.active) { + VMM.ExternalAPI.twitter.pushQue(); + } + if (VMM.master_config.flickr.active) { + VMM.ExternalAPI.flickr.pushQue(); + } }, twitter: { tweetArray: [], + get: function(mid, id) { + var tweet = {mid: mid, id: id}; + VMM.master_config.twitter.que.push(tweet); + VMM.master_config.twitter.active = true; + //VMM.master_config.api.pushques.push(VMM.ExternalAPI.twitter.pushQue); + + }, + + create: function(tweet, callback) { + + var id = tweet.mid.toString(), + error_obj = { twitterid: tweet.mid }, + the_url = "http://api.twitter.com/1/statuses/show.json?id=" + tweet.mid + "&include_entities=true&callback=?", + twitter_timeout = setTimeout(VMM.ExternalAPI.twitter.errorTimeOut, VMM.master_config.timers.api, tweet), + callback_timeout= setTimeout(callback, VMM.master_config.timers.api, tweet); + + VMM.getJSON(the_url, function(d) { + var id = d.id_str, + twit = "

", + td = VMM.Util.linkify_with_twitter(d.text, "_blank"); + + // TWEET CONTENT + twit += td; + twit += "

"; + + // TWEET MEDIA + if (typeof d.entities.media != 'undefined') { + if (d.entities.media[0].type == "photo") { + twit += "" + } + } + + // TWEET AUTHOR + twit += "
"; + twit += ""; + twit += ""; + twit += "" + d.user.name + ""; + twit += "@" + d.user.screen_name + ""; + twit += ""; + twit += "
"; + + + + VMM.attachElement("#tweet_"+tweet.id.toString(), twit ); + VMM.attachElement("#text_thumb_"+tweet.id.toString(), d.text ); + + }) + .error(function(jqXHR, textStatus, errorThrown) { + trace("TWITTER error"); + trace("TWITTER ERROR: " + textStatus + " " + jqXHR.responseText); + VMM.attachElement("#tweet_"+tweet.id, "

ERROR LOADING TWEET " + tweet.mid + "

" ); + }) + .success(function(d) { + clearTimeout(twitter_timeout); + clearTimeout(callback_timeout); + callback(); + }); + + }, + + errorTimeOut: function(tweet) { + trace("TWITTER JSON ERROR TIMEOUT " + tweet.mid); + VMM.attachElement("#tweet_" + tweet.id, "

Still waiting on Twitter: " + tweet.mid + "

" ); + + // CHECK RATE STATUS + VMM.getJSON("http://api.twitter.com/1/account/rate_limit_status.json", function(d) { + trace("REMAINING TWITTER API CALLS " + d.remaining_hits); + trace("TWITTER RATE LIMIT WILL RESET AT " + d.reset_time); + var mes = ""; + if (d.remaining_hits == 0) { + mes = "

You've reached the maximum number of tweets you can load in an hour.

"; + mes += "

You can view tweets again starting at:
" + d.reset_time + "

"; + } else { + mes = "

Still waiting on Twitter. " + id + "

"; + //mes = "

Tweet " + id + " was not found.

"; + } + VMM.attachElement("#twitter_" + id, "" + mes + "" ); + }); + + }, + + pushQue: function() { + if (VMM.master_config.twitter.que.length > 0) { + VMM.ExternalAPI.twitter.create(VMM.master_config.twitter.que[0], VMM.ExternalAPI.twitter.pushQue); + VMM.master_config.twitter.que.remove(0); + } + }, + + + getHTML: function(id) { //var the_url = document.location.protocol + "//api.twitter.com/1/statuses/oembed.json?id=" + id+ "&callback=?"; var the_url = "http://api.twitter.com/1/statuses/oembed.json?id=" + id+ "&callback=?"; @@ -152,7 +247,7 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { twitterid: id }; var the_url = "http://api.twitter.com/1/statuses/show.json?id=" + id + "&include_entities=true&callback=?"; - var twitter_timeout = setTimeout(VMM.ExternalAPI.twitter.notFoundError, 4000, id); + var twitter_timeout = setTimeout(VMM.ExternalAPI.twitter.errorTimeOut, VMM.master_config.timers.api, id); VMM.getJSON(the_url, VMM.ExternalAPI.twitter.formatJSON) .error(function(jqXHR, textStatus, errorThrown) { @@ -168,25 +263,7 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { }); }, - notFoundError: function(id) { - trace("TWITTER JSON ERROR TIMEOUT " + id); - VMM.attachElement("#twitter_" + id, "

Error loading tweet: " + id + "

" ); - - // CHECK RATE STATUS - VMM.getJSON("http://api.twitter.com/1/account/rate_limit_status.json", function(d) { - trace("REMAINING TWITTER API CALLS " + d.remaining_hits); - trace("TWITTER RATE LIMIT WILL RESET AT " + d.reset_time); - var mes = ""; - if (d.remaining_hits == 0) { - mes = "

You've reached the maximum number of tweets you can load in an hour.

"; - mes += "

You can view tweets again starting at:
" + d.reset_time + "

"; - } else { - mes = "

Tweet " + id + " was not found.

"; - } - VMM.attachElement("#twitter_" + id, "" + mes + "" ); - }); - - }, + formatJSON: function(d) { var id = d.id_str; @@ -486,16 +563,24 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { googleplus: { get: function(user, activity) { - var api_key, gplus; - - + var api_key; var gplus = {user: user, activity: activity}; + VMM.master_config.googleplus.que.push(gplus); VMM.master_config.googleplus.active = true; }, - create: function(gplus) { - var mediaElem = "", api_key = "", gperson_api_url, gactivity_api_url, g_activity = "", g_content = "", g_attachments = ""; + create: function(gplus, callback) { + var mediaElem = "", + api_key = "", + g_activity = "", + g_content = "", + g_attachments = "", + gperson_api_url, + gactivity_api_url; + googleplus_timeout = setTimeout(VMM.ExternalAPI.googleplus.errorTimeOut, VMM.master_config.timers.api, gplus), + callback_timeout = setTimeout(callback, VMM.master_config.timers.api, gplus); + if (VMM.master_config.Timeline.api_keys.google != "") { api_key = VMM.master_config.Timeline.api_keys.google; @@ -584,16 +669,39 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { + }) + .error(function(jqXHR, textStatus, errorThrown) { + var error_obj = VMM.parseJSON(jqXHR.responseText); + trace(error_obj.error.message); + VMM.attachElement("#googleplus_" + gplus.activity, "

ERROR LOADING GOOGLE+

" + error_obj.error.message + "

"); + }) + .success(function(d) { + clearTimeout(googleplus_timeout); + clearTimeout(callback_timeout); + callback(); }); + }, pushQue: function() { + if (VMM.master_config.googleplus.que.length > 0) { + VMM.ExternalAPI.googleplus.create(VMM.master_config.googleplus.que[0], VMM.ExternalAPI.googleplus.pushQue); + VMM.master_config.googleplus.que.remove(0); + } + /* for(var i = 0; i < VMM.master_config.googleplus.que.length; i++) { VMM.ExternalAPI.googleplus.create(VMM.master_config.googleplus.que[i]); } VMM.master_config.googleplus.que = []; + */ + }, + + errorTimeOut: function(gplus) { + trace("GOOGLE+ JSON ERROR TIMEOUT " + gplus.activity); + VMM.attachElement("#googleplus_" + gplus.activity, "

Still waiting on GOOGLE+

" + gplus.activity + "

"); + } }, @@ -617,6 +725,7 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { }, pushQue: function() { + for(var i = 0; i < VMM.master_config.googledocs.que.length; i++) { VMM.ExternalAPI.googledocs.create(VMM.master_config.googledocs.que[i]); } @@ -628,39 +737,67 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { flickr: { get: function(mid, id) { - var api_key; + var flick = {mid: mid, id: id}; + VMM.master_config.flickr.que.push(flick); + VMM.master_config.flickr.active = true; + }, + + create: function(flick, callback) { + var api_key, + callback_timeout= setTimeout(callback, VMM.master_config.timers.api, flick); + if (VMM.master_config.Timeline.api_keys.flickr != "") { api_key = VMM.master_config.Timeline.api_keys.flickr; } else { api_key = Aes.Ctr.decrypt(VMM.master_config.api_keys_master.flickr, VMM.master_config.vp, 256) } - var the_url = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=" + api_key + "&photo_id=" + mid + "&format=json&jsoncallback=?"; - VMM.getJSON(the_url, VMM.ExternalAPI.flickr.create); - }, - - create: function(d) { - var flickr_id = d.sizes.size[0].url.split("photos\/")[1].split("/")[1]; - var id = "flickr_" + flickr_id; - var flickr_large_id = id + "_large"; - var flickr_thumb_id = id + "_thumb"; - var flickr_img_size, flickr_img_thumb, flickr_size_found = false; - var flickr_best_size = "Large"; + var the_url = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=" + api_key + "&photo_id=" + flick.mid + "&format=json&jsoncallback=?"; + + VMM.getJSON(the_url, function(d) { + var flickr_id = d.sizes.size[0].url.split("photos\/")[1].split("/")[1]; + + var flickr_large_id = "flickr_" + flick.id + "_large", + flickr_thumb_id = "flickr_" + flick.id + "_thumb"; + //flickr_thumb_id = "flickr_" + uid + "_thumb"; - flickr_best_size = VMM.ExternalAPI.flickr.sizes(VMM.master_config.sizes.api.height); + var flickr_img_size, + flickr_img_thumb, + flickr_size_found = false, + flickr_best_size = "Large"; - for(var i = 0; i < d.sizes.size.length; i++) { - if (d.sizes.size[i].label == flickr_best_size) { - flickr_size_found = true; - flickr_img_size = d.sizes.size[i].source; + flickr_best_size = VMM.ExternalAPI.flickr.sizes(VMM.master_config.sizes.api.height); + + for(var i = 0; i < d.sizes.size.length; i++) { + if (d.sizes.size[i].label == flickr_best_size) { + flickr_size_found = true; + flickr_img_size = d.sizes.size[i].source; + } } - } - if (!flickr_size_found) { - flickr_img_size = d.sizes.size[d.sizes.size.length - 1].source; - } + if (!flickr_size_found) { + flickr_img_size = d.sizes.size[d.sizes.size.length - 1].source; + } + + flickr_img_thumb = d.sizes.size[0].source; + VMM.Lib.attr("#"+flickr_large_id, "src", flickr_img_size); + VMM.attachElement("#"+flickr_thumb_id, ""); + + }) + .error(function(jqXHR, textStatus, errorThrown) { + trace("FLICKR error"); + trace("FLICKR ERROR: " + textStatus + " " + jqXHR.responseText); + }) + .success(function(d) { + clearTimeout(callback_timeout); + callback(); + }); - flickr_img_thumb = d.sizes.size[0].source; - VMM.Lib.attr("#"+flickr_large_id, "src", flickr_img_size); - VMM.attachElement("#"+flickr_thumb_id, ""); + }, + + pushQue: function() { + if (VMM.master_config.flickr.que.length > 0) { + VMM.ExternalAPI.flickr.create(VMM.master_config.flickr.que[0], VMM.ExternalAPI.flickr.pushQue); + VMM.master_config.flickr.que.remove(0); + } }, sizes: function(s) { @@ -717,19 +854,20 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { VMM.master_config.soundcloud.active = true; }, - create: function(sound) { + create: function(sound, callback) { var the_url = "http://soundcloud.com/oembed?url=" + sound.url + "&format=js&callback=?"; VMM.getJSON(the_url, function(d) { VMM.attachElement("#"+sound.id, d.html); + callback(); }); }, pushQue: function() { - for(var i = 0; i < VMM.master_config.soundcloud.que.length; i++) { - VMM.ExternalAPI.soundcloud.create(VMM.master_config.soundcloud.que[i]); + if (VMM.master_config.soundcloud.que.length > 0) { + VMM.ExternalAPI.soundcloud.create(VMM.master_config.soundcloud.que[0], VMM.ExternalAPI.soundcloud.pushQue); + VMM.master_config.soundcloud.que.remove(0); } - VMM.master_config.soundcloud.que = []; - }, + } }, @@ -741,9 +879,10 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { VMM.master_config.wikipedia.active = true; }, - create: function(api_obj) { + create: function(api_obj, callback) { var the_url = "http://" + api_obj.lang + ".wikipedia.org/w/api.php?action=query&prop=extracts&redirects=&titles=" + api_obj.url + "&exintro=1&format=json&callback=?"; - + callback_timeout= setTimeout(callback, VMM.master_config.timers.api, api_obj); + if ( VMM.Browser.browser == "Explorer" && parseInt(VMM.Browser.version, 10) >= 7 && window.XDomainRequest) { var temp_text = "

" + api_obj.url + "

"; temp_text += "" + VMM.master_config.language.messages.wikipedia + ""; @@ -785,17 +924,43 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { VMM.attachElement("#"+api_obj.id, _wiki ); } } + //callback(); + }) + .error(function(jqXHR, textStatus, errorThrown) { + trace("WIKIPEDIA error"); + trace("WIKIPEDIA ERROR: " + textStatus + " " + jqXHR.responseText); + trace(errorThrown); + VMM.attachElement("#"+api_obj.id, "" + "

Wikipedia is not responding

" + "
" ); + // TRY AGAIN? + clearTimeout(callback_timeout); + if (VMM.master_config.wikipedia.tries < 4) { + trace("WIKIPEDIA ATTEMPT " + VMM.master_config.wikipedia.tries); + trace(api_obj); + VMM.master_config.wikipedia.tries++; + VMM.ExternalAPI.wikipedia.create(api_obj, callback); + } else { + callback(); + } + + }) + .success(function(d) { + VMM.master_config.wikipedia.tries = 0; + clearTimeout(callback_timeout); + callback(); }); + }, pushQue: function() { - trace("WIKIPEDIA PUSH QUE"); - for(var i = 0; i < VMM.master_config.wikipedia.que.length; i++) { - VMM.ExternalAPI.wikipedia.create(VMM.master_config.wikipedia.que[i]); + + if (VMM.master_config.wikipedia.que.length > 0) { + trace("WIKIPEDIA PUSH QUE " + VMM.master_config.wikipedia.que.length); + VMM.ExternalAPI.wikipedia.create(VMM.master_config.wikipedia.que[0], VMM.ExternalAPI.wikipedia.pushQue); + VMM.master_config.wikipedia.que.remove(0); } - VMM.master_config.wikipedia.que = []; + }, }, @@ -903,11 +1068,15 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { VMM.master_config.vimeo.active = true; }, - create: function(d) { + create: function(d, callback) { trace("VIMEO CREATE"); // THUMBNAIL var url = "http://vimeo.com/api/v2/video/" + d + ".json"; - VMM.getJSON(url, VMM.ExternalAPI.vimeo.createThumb); + VMM.getJSON(url, function(d) { + VMM.ExternalAPI.vimeo.createThumb(d); + callback(); + }); + }, createThumb: function(d) { @@ -917,10 +1086,16 @@ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { }, pushQue: function() { + if (VMM.master_config.vimeo.que.length > 0) { + VMM.ExternalAPI.vimeo.create(VMM.master_config.vimeo.que[0], VMM.ExternalAPI.vimeo.pushQue); + VMM.master_config.vimeo.que.remove(0); + } + /* for(var i = 0; i < VMM.master_config.vimeo.que.length; i++) { VMM.ExternalAPI.vimeo.create(VMM.master_config.vimeo.que[i]); } VMM.master_config.vimeo.que = []; + */ } } diff --git a/source/js/Media/VMM.MediaElement.js b/source/js/Media/VMM.MediaElement.js index 936ad30..837e992 100644 --- a/source/js/Media/VMM.MediaElement.js +++ b/source/js/Media/VMM.MediaElement.js @@ -27,7 +27,7 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { mediaElem = "
"; return mediaElem; } else if (m.type == "flickr") { - mediaElem = "
"; + mediaElem = "
"; return mediaElem; } else if (m.type == "instagram") { mediaElem = "
"; @@ -85,7 +85,7 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { } }, - create: function(data, secondary) { + create: function(data, uid) { var _valid = false, loading_messege = "

" + VMM.master_config.language.messages.loading + "

"; @@ -108,18 +108,16 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { mediaElem = "
"; // FLICKR } else if (m.type == "flickr") { - _id = "flickr_" + m.id; + _id = "flickr_" + uid; mediaElem = "
"; - VMM.ExternalAPI.flickr.get(m.id, "#" + _id); + VMM.ExternalAPI.flickr.get(m.id, uid); // INSTAGRAM } else if (m.type == "instagram") { - _id = "flickr_" + m.id; mediaElem = "
"; // GOOGLE DOCS } else if (m.type == "googledoc") { - _id = "googledoc_" + VMM.Util.unique_ID(5); - mediaElem = "
" + loading_messege + "
"; - VMM.ExternalAPI.googledocs.get(m.id, _id); + mediaElem = "
" + loading_messege + "
"; + VMM.ExternalAPI.googledocs.get(m.id, uid); // YOUTUBE } else if (m.type == "youtube") { mediaElem = "
" + loading_messege + "
"; @@ -133,23 +131,21 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { mediaElem = "
"; // TWITTER } else if (m.type == "twitter"){ - mediaElem = "
" + loading_messege + "
"; + mediaElem = "
" + loading_messege + "
"; isTextMedia = true; - VMM.ExternalAPI.twitter.prettyHTML(m.id, secondary); + VMM.ExternalAPI.twitter.get(m.id, uid); // TWITTER } else if (m.type == "twitter-ready") { isTextMedia = true; mediaElem = m.id; // SOUNDCLOUD } else if (m.type == "soundcloud") { - _id = "soundcloud_" + VMM.Util.unique_ID(5); - mediaElem = "
" + loading_messege + "
"; - VMM.ExternalAPI.soundcloud.get(m.id, _id); + mediaElem = "
" + loading_messege + "
"; + VMM.ExternalAPI.soundcloud.get(m.id, uid); // GOOGLE MAPS } else if (m.type == "google-map") { - _id = "googlemap_" + VMM.Util.unique_ID(7); - mediaElem = "
" + loading_messege + "
"; - VMM.ExternalAPI.googlemaps.get(m.id, _id); + mediaElem = "
" + loading_messege + "
"; + VMM.ExternalAPI.googlemaps.get(m.id, uid); // GOOGLE PLUS } else if (m.type == "googleplus") { _id = "googleplus_" + m.id; @@ -158,10 +154,9 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { VMM.ExternalAPI.googleplus.get(m.user, m.id); // WIKIPEDIA } else if (m.type == "wikipedia") { - _id = "wikipedia_" + VMM.Util.unique_ID(7); - mediaElem = "
" + loading_messege + "
"; + mediaElem = "
" + loading_messege + "
"; isTextMedia = true; - VMM.ExternalAPI.wikipedia.get(m.id, _id, m.lang); + VMM.ExternalAPI.wikipedia.get(m.id, m.uniqueid, m.lang); // STORIFY } else if (m.type == "storify") { isTextMedia = true; diff --git a/source/js/Media/VMM.MediaType.js b/source/js/Media/VMM.MediaType.js index 335940d..39264c0 100644 --- a/source/js/Media/VMM.MediaType.js +++ b/source/js/Media/VMM.MediaType.js @@ -6,8 +6,14 @@ if(typeof VMM != 'undefined' && typeof VMM.MediaType == 'undefined') { // VMM.MediaType(url); //returns an object with .type and .id VMM.MediaType = function(d) { - var success = false; - var media = {}; + var success = false, + media = { + type: "unknown", + id: "", + link: "", + lang: "", + uniqueid: VMM.Util.unique_ID(6) + }; if (d.match("div class='twitter'")) { media.type = "twitter-ready"; diff --git a/source/js/Slider/VMM.Slider.Slide.js b/source/js/Slider/VMM.Slider.Slide.js index 22d6bf7..a354f83 100644 --- a/source/js/Slider/VMM.Slider.Slide.js +++ b/source/js/Slider/VMM.Slider.Slide.js @@ -230,7 +230,7 @@ if (typeof VMM.Slider != 'undefined') { if (data.asset != null && data.asset != "") { if (data.asset.media != null && data.asset.media != "") { c.has.media = true; - $media = VMM.appendAndGetElement($slide, "
", "media", VMM.MediaElement.create(data.asset)); + $media = VMM.appendAndGetElement($slide, "
", "media", VMM.MediaElement.create(data.asset, data.uniqueid)); } }