/* External API ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.ExternalAPI == 'undefined') { VMM.ExternalAPI = { pushQues: function() { if (VMM.master_config.googlemaps.active) { VMM.ExternalAPI.googlemaps.pushQue(); } if (VMM.master_config.youtube.active) { VMM.ExternalAPI.youtube.pushQue(); } if (VMM.master_config.soundcloud.active) { VMM.ExternalAPI.soundcloud.pushQue(); } if (VMM.master_config.googledocs.active) { VMM.ExternalAPI.googledocs.pushQue(); } }, twitter: { tweetArray: [], // VMM.ExternalAPI.twitter.getHTML(id); 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=?"; VMM.getJSON(the_url, VMM.ExternalAPI.twitter.onJSONLoaded); }, onJSONLoaded: function(d) { trace("TWITTER JSON LOADED"); var id = d.id; VMM.attachElement("#"+id, VMM.Util.linkify_with_twitter(d.html) ); }, // VMM.ExternalAPI.twitter.parseTwitterDate(date); parseTwitterDate: function(d) { var date = new Date(Date.parse(d)); /* var t = d.replace(/(\d{1,2}[:]\d{2}[:]\d{2}) (.*)/, '$2 $1'); t = t.replace(/(\+\S+) (.*)/, '$2 $1'); var date = new Date(Date.parse(t)).toLocaleDateString(); var time = new Date(Date.parse(t)).toLocaleTimeString(); */ return date; }, prettyParseTwitterDate: function(d) { var date = new Date(Date.parse(d)); return VMM.Util.date.prettyDate(date, true); }, // VMM.ExternalAPI.twitter.getTweets(tweets_array); getTweets: function(tweets) { var tweetArray = []; var number_of_tweets = tweets.length; for(var i = 0; i < tweets.length; i++) { var twitter_id = ""; /* FIND THE TWITTER ID ================================================== */ if (tweets[i].tweet.match("status\/")) { twitter_id = tweets[i].tweet.split("status\/")[1]; } else if (tweets[i].tweet.match("statuses\/")) { twitter_id = tweets[i].tweet.split("statuses\/")[1]; } else { twitter_id = ""; } /* FETCH THE DATA ================================================== */ var the_url = "http://api.twitter.com/1/statuses/show.json?id=" + twitter_id + "&include_entities=true&callback=?"; VMM.getJSON(the_url, function(d) { var tweet = {} /* FORMAT RESPONSE ================================================== */ var twit = "

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

"; twit += "— " + d.user.name + " (@" + d.user.screen_name + ") " + VMM.ExternalAPI.twitter.prettyParseTwitterDate(d.created_at) + "
"; tweet.content = twit; tweet.raw = d; tweetArray.push(tweet); /* CHECK IF THATS ALL OF THEM ================================================== */ if (tweetArray.length == number_of_tweets) { var the_tweets = {tweetdata: tweetArray} VMM.fireEvent(global, "TWEETSLOADED", the_tweets); } }) .success(function() { trace("second success"); }) .error(function() { trace("error"); }) .complete(function() { trace("complete"); }); } }, // VMM.ExternalAPI.twitter.getTweetSearch(search string); getTweetSearch: function(tweets, number_of_tweets) { var _number_of_tweets = 40; if (number_of_tweets != null && number_of_tweets != "") { _number_of_tweets = number_of_tweets; } var the_url = "http://search.twitter.com/search.json?q=" + tweets + "&rpp=" + _number_of_tweets + "&include_entities=true&result_type=mixed"; var tweetArray = []; VMM.getJSON(the_url, function(d) { /* FORMAT RESPONSE ================================================== */ for(var i = 0; i < d.results.length; i++) { var tweet = {} var twit = "

"; var td = VMM.Util.linkify_with_twitter(d.results[i].text, "_blank"); twit += td; twit += "

"; twit += "— " + d.results[i].from_user_name + " (@" + d.results[i].from_user + ") " + VMM.ExternalAPI.twitter.prettyParseTwitterDate(d.results[i].created_at) + "
"; tweet.content = twit; tweet.raw = d.results[i]; tweetArray.push(tweet); } var the_tweets = {tweetdata: tweetArray} VMM.fireEvent(global, "TWEETSLOADED", the_tweets); }); }, prettyHTML: function(id) { var id = id.toString(); var error_obj = { twitterid: id }; var the_url = "http://api.twitter.com/1/statuses/show.json?id=" + id + "&include_entities=true&callback=?"; trace("id " + id); var twitter_timeout = setTimeout(VMM.ExternalAPI.twitter.notFoundError, 4000, id); VMM.getJSON(the_url, VMM.ExternalAPI.twitter.formatJSON) .error(function(jqXHR, textStatus, errorThrown) { trace("TWITTER error"); trace("TWITTER ERROR: " + textStatus + " " + jqXHR.responseText); VMM.attachElement("#twitter_"+id, "

ERROR LOADING TWEET " + id + "

" ); }) .success(function() { clearTimeout(twitter_timeout); }); }, 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) { trace("TWITTER JSON LOADED F"); trace(d); var id = d.id_str; var twit = "

"; var td = VMM.Util.linkify_with_twitter(d.text, "_blank"); //td = td.replace(/(@([\w]+))/g,"$1"); //td = td.replace(/(#([\w]+))/g,"$1"); twit += td; twit += "

"; twit += " " + "" + " "; twit += "
"; twit += ""; twit += ""; twit += "" + d.user.name + ""; twit += "@" + d.user.screen_name + ""; twit += ""; twit += "
"; VMM.attachElement("#twitter_"+id.toString(), twit ); } }, googlemaps: { get: function(url, id) { var timer; var map_vars = VMM.Util.getUrlVars(url); var api_key; if (VMM.master_config.Timeline.api_keys.google != "") { api_key = VMM.master_config.Timeline.api_keys.google; } else { api_key = Aes.Ctr.decrypt(VMM.master_config.api_keys_master.google, VMM.master_config.vp, 256); } var map_url = "http://maps.googleapis.com/maps/api/js?key=" + api_key + "&libraries=places&sensor=false&callback=VMM.ExternalAPI.googlemaps.onMapAPIReady"; var map = { url: url, vars: map_vars, id: id }; if (VMM.master_config.googlemaps.active) { VMM.master_config.googlemaps.que.push(map); } else { VMM.master_config.googlemaps.que.push(map); if (VMM.master_config.googlemaps.api_loaded) { } else { VMM.LoadLib.js(map_url, function() { trace("Google Maps API Library Loaded"); }); } } }, create: function(m) { var map_attribution = ""; var layer; var map; function mapProvider(name) { if (name in VMM.ExternalAPI.googlemaps.map_providers) { map_attribution = VMM.ExternalAPI.googlemaps.map_attribution[VMM.ExternalAPI.googlemaps.map_providers[name].attribution]; return VMM.ExternalAPI.googlemaps.map_providers[name]; } else { if (VMM.ExternalAPI.googlemaps.defaultType(name)) { trace("GOOGLE MAP DEFAULT TYPE"); return google.maps.MapTypeId[name.toUpperCase()]; } else { trace("Not a maptype: " + name ); } } } google.maps.VeriteMapType = function(name) { if (VMM.ExternalAPI.googlemaps.defaultType(name)) { return google.maps.MapTypeId[name.toUpperCase()]; } else { var provider = mapProvider(name); return google.maps.ImageMapType.call(this, { "getTileUrl": function(coord, zoom) { var index = (zoom + coord.x + coord.y) % VMM.ExternalAPI.googlemaps.map_subdomains.length; return [ provider.url .replace("{S}", VMM.ExternalAPI.googlemaps.map_subdomains[index]) .replace("{Z}", zoom) .replace("{X}", coord.x) .replace("{Y}", coord.y) .replace("{z}", zoom) .replace("{x}", coord.x) .replace("{y}", coord.y) ]; }, "tileSize": new google.maps.Size(256, 256), "name": name, "minZoom": provider.minZoom, "maxZoom": provider.maxZoom }); } }; google.maps.VeriteMapType.prototype = new google.maps.ImageMapType("_"); /* Make the Map ================================================== */ if (type.of(VMM.master_config.Timeline.maptype) == "string") { if (VMM.ExternalAPI.googlemaps.defaultType(VMM.master_config.Timeline.maptype)) { layer = google.maps.MapTypeId[VMM.master_config.Timeline.maptype.toUpperCase()]; } else { layer = VMM.master_config.Timeline.maptype; } } else { layer = "toner"; } var location = new google.maps.LatLng(41.875696,-87.624207); var latlong; var zoom = 11; var has_location = false; var has_zoom = false; var map_bounds; if (type.of(VMM.Util.getUrlVars(m.url)["ll"]) == "string") { has_location = true; latlong = VMM.Util.getUrlVars(m.url)["ll"].split(","); location = new google.maps.LatLng(parseFloat(latlong[0]),parseFloat(latlong[1])); } else if (type.of(VMM.Util.getUrlVars(m.url)["sll"]) == "string") { latlong = VMM.Util.getUrlVars(m.url)["sll"].split(","); location = new google.maps.LatLng(parseFloat(latlong[0]),parseFloat(latlong[1])); } if (type.of(VMM.Util.getUrlVars(m.url)["z"]) == "string") { has_zoom = true; zoom = parseFloat(VMM.Util.getUrlVars(m.url)["z"]); } var map_options = { zoom: zoom, disableDefaultUI: true, mapTypeControl: false, zoomControl: true, zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL, position: google.maps.ControlPosition.TOP_RIGHT }, center: location, mapTypeId: layer, mapTypeControlOptions: { mapTypeIds: [layer] } } var unique_map_id = m.id.toString() + "_gmap"; VMM.attachElement("#" + m.id, "
"); var map = new google.maps.Map(document.getElementById(unique_map_id), map_options); if (VMM.ExternalAPI.googlemaps.defaultType(VMM.master_config.Timeline.maptype)) { } else { map.mapTypes.set(layer, new google.maps.VeriteMapType(layer)); // ATTRIBUTION var map_attribution_html = "
" + map_attribution + "
"; VMM.appendElement("#"+unique_map_id, map_attribution_html); } loadKML(); // KML function loadKML() { var kml_url = m.url + "&output=kml"; kml_url = kml_url.replace("&output=embed", ""); var kml_layer = new google.maps.KmlLayer(kml_url, {preserveViewport:true}); var infowindow = new google.maps.InfoWindow(); kml_layer.setMap(map); google.maps.event.addListenerOnce(kml_layer, "defaultviewport_changed", function() { map.fitBounds(kml_layer.getDefaultViewport() ); if (has_location) { map.panTo(location); } if (has_zoom) { map.setZoom(zoom); } }); google.maps.event.addListener(kml_layer, 'click', function(kmlEvent) { var text = kmlEvent.featureData.description; showInfoWindow(text); function showInfoWindow(c) { infowindow.setContent(c); infowindow.open(map); } }); } }, pushQue: function() { for(var i = 0; i < VMM.master_config.googlemaps.que.length; i++) { VMM.ExternalAPI.googlemaps.create(VMM.master_config.googlemaps.que[i]); } VMM.master_config.googlemaps.que = []; }, onMapAPIReady: function() { VMM.master_config.googlemaps.map_active = true; VMM.master_config.googlemaps.places_active = true; VMM.ExternalAPI.googlemaps.onAPIReady(); }, onPlacesAPIReady: function() { VMM.master_config.googlemaps.places_active = true; VMM.ExternalAPI.googlemaps.onAPIReady(); }, onAPIReady: function() { if (!VMM.master_config.googlemaps.active) { if (VMM.master_config.googlemaps.map_active && VMM.master_config.googlemaps.places_active) { VMM.master_config.googlemaps.active = true; VMM.ExternalAPI.googlemaps.pushQue(); } } }, defaultType: function(name) { if (name.toLowerCase() == "satellite" || name.toLowerCase() == "hybrid" || name.toLowerCase() == "terrain" || name.toLowerCase() == "roadmap") { return true; } else { return false; } }, map_subdomains: ["", "a.", "b.", "c.", "d."], map_attribution: { "stamen": "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.", "apple": "Map data © 2012 Apple, Imagery © 2012 Apple" }, map_providers: { "toner": { "url": "http://{S}tile.stamen.com/toner/{Z}/{X}/{Y}.png", "minZoom": 0, "maxZoom": 20, "attribution": "stamen" }, "toner-lines": { "url": "http://{S}tile.stamen.com/toner-lines/{Z}/{X}/{Y}.png", "minZoom": 0, "maxZoom": 20, "attribution": "stamen" }, "toner-labels": { "url": "http://{S}tile.stamen.com/toner-labels/{Z}/{X}/{Y}.png", "minZoom": 0, "maxZoom": 20, "attribution": "stamen" }, "sterrain": { "url": "http://{S}tile.stamen.com/terrain/{Z}/{X}/{Y}.jpg", "minZoom": 4, "maxZoom": 20, "attribution": "stamen" }, "apple": { "url": "http://gsp2.apple.com/tile?api=1&style=slideshow&layers=default&lang=en_US&z={z}&x={x}&y={y}&v=9", "minZoom": 4, "maxZoom": 14, "attribution": "apple" }, "watercolor": { "url": "http://{S}tile.stamen.com/watercolor/{Z}/{X}/{Y}.jpg", "minZoom": 3, "maxZoom": 16, "attribution": "stamen" } }, }, googledocs: { get: function(url, id) { var doc = {url: url, id: id}; VMM.master_config.googledocs.que.push(doc); VMM.master_config.googledocs.active = true; }, create: function(doc) { var mediaElem = ""; if (doc.url.match(/docs.google.com/i)) { mediaElem = ""; } else { mediaElem = ""; } VMM.attachElement("#"+doc.id, mediaElem); }, pushQue: function() { for(var i = 0; i < VMM.master_config.googledocs.que.length; i++) { VMM.ExternalAPI.googledocs.create(VMM.master_config.googledocs.que[i]); } VMM.master_config.googledocs.que = []; } }, flickr: { get: function(mid, id) { var api_key; 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"; // FIND LARGE SIZE var flickr_img_large; var flickr_large_found = false; for(var i = 0; i < d.sizes.size.length; i++) { if (d.sizes.size[i].label == "Large") { flickr_large_found = true; flickr_img_large = d.sizes.size[i].source; } } if (!flickr_large_found) { flickr_img_large = d.sizes.size[d.sizes.size.length - 1].source; } var flickr_img_thumb = d.sizes.size[0].source; VMM.Lib.attr("#"+flickr_large_id, "src", flickr_img_large); VMM.Lib.attr("#"+flickr_thumb_id, "src", flickr_img_thumb); } }, soundcloud: { get: function(url, id) { var sound = {url: url, id: id}; VMM.master_config.soundcloud.que.push(sound); VMM.master_config.soundcloud.active = true; }, create: function(sound) { 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); }); }, pushQue: function() { for(var i = 0; i < VMM.master_config.soundcloud.que.length; i++) { VMM.ExternalAPI.soundcloud.create(VMM.master_config.soundcloud.que[i]); } VMM.master_config.soundcloud.que = []; }, }, wikipedia: { //http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Beastie%20Boys&format=json&exintro=1 get: function(url, id) { var api_obj = {url: url, id: id}; VMM.master_config.wikipedia.que.push(api_obj); VMM.master_config.wikipedia.active = true; }, create: function(api_obj) { VMM.attachElement("#"+api_obj.id, api_obj.url); /* var the_url = "http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=" + wiki.url + "&format=json&exintro=1&callback=?"; VMM.getJSON(the_url, function(d) { if (d.query.pages[0].extract.match("REDIRECT")) { } VMM.attachElement("#"+wiki.id, d.html); }); */ }, pushQue: function() { for(var i = 0; i < VMM.master_config.wikipedia.que.length; i++) { VMM.ExternalAPI.wikipedia.create(VMM.master_config.wikipedia.que[i]); } VMM.master_config.wikipedia.que = []; }, }, youtube: { get: function(id) { if (VMM.master_config.youtube.active) { VMM.master_config.youtube.que.push(id); } else { VMM.master_config.youtube.que.push(id); if (!VMM.master_config.youtube.api_loaded) { VMM.LoadLib.js('http://www.youtube.com/player_api', function() { trace("YouTube API Library Loaded"); }); } } }, create: function(id) { var p = { active: false, player: {}, name: 'youtube_'+id, playing: false }; p.player['youtube_'+id] = new YT.Player('youtube_'+id, { height: '390', width: '640', playerVars: { enablejsapi: 1, color: 'white', showinfo: 0, theme: 'light', rel: 0 }, videoId: id, events: { 'onReady': VMM.ExternalAPI.youtube.onPlayerReady, 'onStateChange': VMM.ExternalAPI.youtube.onStateChange } }); VMM.master_config.youtube.array.push(p); }, pushQue: function() { for(var i = 0; i < VMM.master_config.youtube.que.length; i++) { VMM.ExternalAPI.youtube.create(VMM.master_config.youtube.que[i]); } VMM.master_config.youtube.que = []; }, onAPIReady: function() { VMM.master_config.youtube.active = true; VMM.ExternalAPI.youtube.pushQue(); }, stopPlayers: function() { for(var i = 0; i < VMM.master_config.youtube.array.length; i++) { if (VMM.master_config.youtube.array[i].playing) { var the_name = VMM.master_config.youtube.array[i].name; VMM.master_config.youtube.array[i].player[the_name].stopVideo(); } } }, onStateChange: function(e) { for(var i = 0; i < VMM.master_config.youtube.array.length; i++) { var the_name = VMM.master_config.youtube.array[i].name; if (VMM.master_config.youtube.array[i].player[the_name] == e.target) { if (e.data == YT.PlayerState.PLAYING) { VMM.master_config.youtube.array[i].playing = true; } } } }, onPlayerReady: function(e) { } } } } /* YOUTUBE API READY Can't find a way to customize this callback and keep it in the VMM namespace Youtube wants it to be this function. ================================================== */ function onYouTubePlayerAPIReady() { trace("GLOBAL YOUTUBE API CALLED") VMM.ExternalAPI.youtube.onAPIReady(); }