/* VMM.Timeline.DataObj.js TIMELINE SOURCE DATA PROCESSOR ================================================== */ if (typeof VMM.Timeline !== 'undefined' && typeof VMM.Timeline.DataObj == 'undefined') { VMM.Timeline.DataObj = { data_obj: {}, model_array: [], getData: function (raw_data) { VMM.Timeline.DataObj.data_obj = {}; VMM.fireEvent(global, VMM.Timeline.Config.events.messege, VMM.Timeline.Config.language.messages.loading_timeline); if (type.of(raw_data) == "object") { trace("DATA SOURCE: JSON OBJECT"); VMM.Timeline.DataObj.parseJSON(raw_data); } else if (type.of(raw_data) == "string") { if (raw_data.match("%23")) { trace("DATA SOURCE: TWITTER SEARCH"); VMM.Timeline.DataObj.model.tweets.getData("%23medill"); } else if ( raw_data.match("spreadsheet") ) { trace("DATA SOURCE: GOOGLE SPREADSHEET"); VMM.Timeline.DataObj.model.googlespreadsheet.getData(raw_data); } else if (raw_data.match("storify.com")) { trace("DATA SOURCE: STORIFY"); VMM.Timeline.DataObj.model.storify.getData(raw_data); //http://api.storify.com/v1/stories/number10gov/g8-and-nato-chicago-summit } else if (raw_data.match("\.jsonp")) { trace("DATA SOURCE: JSONP"); LoadLib.js(raw_data, VMM.Timeline.DataObj.onJSONPLoaded); } else { trace("DATA SOURCE: JSON"); var req = ""; if (raw_data.indexOf("?") > -1) { req = raw_data + "&callback=onJSONP_Data"; } else { req = raw_data + "?callback=onJSONP_Data"; } VMM.getJSON(req, VMM.Timeline.DataObj.parseJSON); } } else if (type.of(raw_data) == "html") { trace("DATA SOURCE: HTML"); VMM.Timeline.DataObj.parseHTML(raw_data); } else { trace("DATA SOURCE: UNKNOWN"); } }, onJSONPLoaded: function() { trace("JSONP IS LOADED"); VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, storyjs_jsonp_data); }, parseHTML: function (d) { trace("parseHTML"); trace("WARNING: THIS IS STILL ALPHA AND WILL NOT WORK WITH ID's other than #timeline"); var _data_obj = VMM.Timeline.DataObj.data_template_obj; /* Timeline start slide ================================================== */ if (VMM.Lib.find("#timeline section", "time")[0]) { _data_obj.timeline.startDate = VMM.Lib.html(VMM.Lib.find("#timeline section", "time")[0]); _data_obj.timeline.headline = VMM.Lib.html(VMM.Lib.find("#timeline section", "h2")); _data_obj.timeline.text = VMM.Lib.html(VMM.Lib.find("#timeline section", "article")); var found_main_media = false; if (VMM.Lib.find("#timeline section", "figure img").length != 0) { found_main_media = true; _data_obj.timeline.asset.media = VMM.Lib.attr(VMM.Lib.find("#timeline section", "figure img"), "src"); } else if (VMM.Lib.find("#timeline section", "figure a").length != 0) { found_main_media = true; _data_obj.timeline.asset.media = VMM.Lib.attr(VMM.Lib.find("#timeline section", "figure a"), "href"); } else { //trace("NOT FOUND"); } if (found_main_media) { if (VMM.Lib.find("#timeline section", "cite").length != 0) { _data_obj.timeline.asset.credit = VMM.Lib.html(VMM.Lib.find("#timeline section", "cite")); } if (VMM.Lib.find(this, "figcaption").length != 0) { _data_obj.timeline.asset.caption = VMM.Lib.html(VMM.Lib.find("#timeline section", "figcaption")); } } } /* Timeline Date Slides ================================================== */ VMM.Lib.each("#timeline li", function(i, elem){ var valid_date = false; var _date = { "type":"default", "startDate":"", "headline":"", "text":"", "asset": { "media":"", "credit":"", "caption":"" }, "tags":"Optional" }; if (VMM.Lib.find(this, "time") != 0) { valid_date = true; _date.startDate = VMM.Lib.html(VMM.Lib.find(this, "time")[0]); if (VMM.Lib.find(this, "time")[1]) { _date.endDate = VMM.Lib.html(VMM.Lib.find(this, "time")[1]); } _date.headline = VMM.Lib.html(VMM.Lib.find(this, "h3")); _date.text = VMM.Lib.html(VMM.Lib.find(this, "article")); var found_media = false; if (VMM.Lib.find(this, "figure img").length != 0) { found_media = true; _date.asset.media = VMM.Lib.attr(VMM.Lib.find(this, "figure img"), "src"); } else if (VMM.Lib.find(this, "figure a").length != 0) { found_media = true; _date.asset.media = VMM.Lib.attr(VMM.Lib.find(this, "figure a"), "href"); } else { //trace("NOT FOUND"); } if (found_media) { if (VMM.Lib.find(this, "cite").length != 0) { _date.asset.credit = VMM.Lib.html(VMM.Lib.find(this, "cite")); } if (VMM.Lib.find(this, "figcaption").length != 0) { _date.asset.caption = VMM.Lib.html(VMM.Lib.find(this, "figcaption")); } } trace(_date); _data_obj.timeline.date.push(_date); } }); VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, _data_obj); }, parseJSON: function(d) { trace("parseJSON"); if (d.timeline.type == "default") { trace("DATA SOURCE: JSON STANDARD TIMELINE"); VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, d); } else if (d.timeline.type == "twitter") { trace("DATA SOURCE: JSON TWEETS"); VMM.Timeline.DataObj.model_Tweets.buildData(d); } else { trace("DATA SOURCE: UNKNOWN JSON"); trace(type.of(d.timeline)); }; }, /* MODEL OBJECTS New Types of Data can be formatted for the timeline here ================================================== */ model: { googlespreadsheet: { extractSpreadsheetKey: function(url) { var key = VMM.Util.getUrlVars(url)["key"]; if (!key) { if (url.match("docs.google.com/spreadsheets/d/")) { var pos = url.indexOf("docs.google.com/spreadsheets/d/") + "docs.google.com/spreadsheets/d/".length; var tail = url.substr(pos); key = tail.split('/')[0] } } if (!key) { key = url} return key; }, getData: function(raw) { var getjsondata, key, worksheet, url, timeout, tries = 0; // new Google Docs URLs can specify 'key' differently. // that format doesn't seem to have a way to specify a worksheet. key = VMM.Timeline.DataObj.model.googlespreadsheet.extractSpreadsheetKey(raw); worksheet = VMM.Util.getUrlVars(raw)["worksheet"]; if (typeof worksheet == "undefined") worksheet = "1"; url = "https://spreadsheets.google.com/feeds/list/" + key + "/" + worksheet + "/public/values?alt=json"; timeout = setTimeout(function() { trace("Google Docs timeout " + url); trace(url); if (tries < 3) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Still waiting on Google Docs, trying again " + tries); tries ++; getjsondata.abort() requestJsonData(); } else { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Google Docs is not responding"); } }, 16000); function requestJsonData() { getjsondata = VMM.getJSON(url, function(d) { clearTimeout(timeout); VMM.Timeline.DataObj.model.googlespreadsheet.buildData(d); }) .error(function(jqXHR, textStatus, errorThrown) { if (jqXHR.status == 400) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Error reading Google spreadsheet. Check the URL and make sure it's published to the web."); clearTimeout(timeout); return; } trace("Google Docs ERROR"); trace("Google Docs ERROR: " + textStatus + " " + jqXHR.responseText); }) .success(function(d) { clearTimeout(timeout); }); } requestJsonData(); }, buildData: function(d) { var data_obj = VMM.Timeline.DataObj.data_template_obj, is_valid = false; VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Parsing Google Doc Data"); function getGVar(v) { if (typeof v != 'undefined') { return v.$t; } else { return ""; } } if (typeof d.feed.entry == 'undefined') { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Error parsing spreadsheet. Make sure you have no blank rows and that the headers have not been changed."); } else { is_valid = true; for(var i = 0; i < d.feed.entry.length; i++) { var dd = d.feed.entry[i], dd_type = ""; if (typeof(dd.gsx$startdate) == 'undefined') { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Missing start date. Make sure the headers of your Google Spreadsheet have not been changed."); return; } if (typeof dd.gsx$type != 'undefined') { dd_type = dd.gsx$type.$t; } else if (typeof dd.gsx$titleslide != 'undefined') { dd_type = dd.gsx$titleslide.$t; } if (dd_type.match("start") || dd_type.match("title") ) { if (data_obj.timeline.startDate) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Invalid data: Multiple 'title' slides. You should only have one row with 'title' in the 'type' column."); return; } data_obj.timeline.startDate = getGVar(dd.gsx$startdate); data_obj.timeline.headline = getGVar(dd.gsx$headline); data_obj.timeline.asset.media = getGVar(dd.gsx$media); data_obj.timeline.asset.caption = getGVar(dd.gsx$mediacaption); data_obj.timeline.asset.credit = getGVar(dd.gsx$mediacredit); data_obj.timeline.text = getGVar(dd.gsx$text); data_obj.timeline.type = "google spreadsheet"; } else if (dd_type.match("era")) { var era = { startDate: getGVar(dd.gsx$startdate), endDate: getGVar(dd.gsx$enddate), headline: getGVar(dd.gsx$headline), text: getGVar(dd.gsx$text), tag: getGVar(dd.gsx$tag) } data_obj.timeline.era.push(era); } else { var date = { type: "google spreadsheet", startDate: getGVar(dd.gsx$startdate), endDate: getGVar(dd.gsx$enddate), headline: getGVar(dd.gsx$headline), text: getGVar(dd.gsx$text), tag: getGVar(dd.gsx$tag), asset: { media: getGVar(dd.gsx$media), credit: getGVar(dd.gsx$mediacredit), caption: getGVar(dd.gsx$mediacaption), thumbnail: getGVar(dd.gsx$mediathumbnail) } }; data_obj.timeline.date.push(date); } }; } if (is_valid) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Finished Parsing Data"); VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, data_obj); } else { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, VMM.Language.messages.loading + " Google Doc Data (cells)"); trace("There may be too many entries. Still trying to load data. Now trying to load cells to avoid Googles limitation on cells"); VMM.Timeline.DataObj.model.googlespreadsheet.getDataCells(d.feed.link[0].href); } }, getDataCells: function(raw) { var getjsondata, key, url, timeout, tries = 0; key = VMM.Timeline.DataObj.model.googlespreadsheet.extractSpreadsheetKey(raw); url = "https://spreadsheets.google.com/feeds/cells/" + key + "/od6/public/values?alt=json"; timeout = setTimeout(function() { trace("Google Docs timeout " + url); trace(url); if (tries < 3) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Still waiting on Google Docs, trying again " + tries); tries ++; getjsondata.abort() requestJsonData(); } else { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Google Docs is not responding"); } }, 16000); function requestJsonData() { getjsondata = VMM.getJSON(url, function(d) { clearTimeout(timeout); VMM.Timeline.DataObj.model.googlespreadsheet.buildDataCells(d); }) .error(function(jqXHR, textStatus, errorThrown) { trace("Google Docs ERROR"); trace("Google Docs ERROR: " + textStatus + " " + jqXHR.responseText); }) .success(function(d) { clearTimeout(timeout); }); } requestJsonData(); }, buildDataCells: function(d) { var data_obj = VMM.Timeline.DataObj.data_template_obj, is_valid = false, cellnames = ["timeline"], list = [], max_row = 0, i = 0, k = 0; VMM.fireEvent(global, VMM.Timeline.Config.events.messege, VMM.Language.messages.loading_timeline + " Parsing Google Doc Data (cells)"); function getGVar(v) { if (typeof v != 'undefined') { return v.$t; } else { return ""; } } if (typeof d.feed.entry != 'undefined') { is_valid = true; // DETERMINE NUMBER OF ROWS for(i = 0; i < d.feed.entry.length; i++) { var dd = d.feed.entry[i]; if (parseInt(dd.gs$cell.row) > max_row) { max_row = parseInt(dd.gs$cell.row); } } // CREATE OBJECT FOR EACH ROW for(var i = 0; i < max_row + 1; i++) { var date = { type: "", startDate: "", endDate: "", headline: "", text: "", tag: "", asset: { media: "", credit: "", caption: "", thumbnail: "" } }; list.push(date); } // PREP GOOGLE DOC CELL DATA TO EVALUATE for(i = 0; i < d.feed.entry.length; i++) { var dd = d.feed.entry[i], dd_type = "", column_name = "", cell = { content: getGVar(dd.gs$cell), col: dd.gs$cell.col, row: dd.gs$cell.row, name: "" }; //trace(cell); if (cell.row == 1) { if (cell.content == "Start Date") { column_name = "startDate"; } else if (cell.content == "End Date") { column_name = "endDate"; } else if (cell.content == "Headline") { column_name = "headline"; } else if (cell.content == "Text") { column_name = "text"; } else if (cell.content == "Media") { column_name = "media"; } else if (cell.content == "Media Credit") { column_name = "credit"; } else if (cell.content == "Media Caption") { column_name = "caption"; } else if (cell.content == "Media Thumbnail") { column_name = "thumbnail"; } else if (cell.content == "Type") { column_name = "type"; } else if (cell.content == "Tag") { column_name = "tag"; } cellnames.push(column_name); } else { cell.name = cellnames[cell.col]; list[cell.row][cell.name] = cell.content; } }; for(i = 0; i < list.length; i++) { var date = list[i]; if (date.type.match("start") || date.type.match("title") ) { data_obj.timeline.startDate = date.startDate; data_obj.timeline.headline = date.headline; data_obj.timeline.asset.media = date.media; data_obj.timeline.asset.caption = date.caption; data_obj.timeline.asset.credit = date.credit; data_obj.timeline.text = date.text; data_obj.timeline.type = "google spreadsheet"; } else if (date.type.match("era")) { var era = { startDate: date.startDate, endDate: date.endDate, headline: date.headline, text: date.text, tag: date.tag } data_obj.timeline.era.push(era); } else { if (date.startDate) { var date = { type: "google spreadsheet", startDate: date.startDate, endDate: date.endDate, headline: date.headline, text: date.text, tag: date.tag, asset: { media: date.media, credit: date.credit, caption: date.caption, thumbnail: date.thumbnail } }; data_obj.timeline.date.push(date); } else { trace("Skipping item " + i + " in list: no start date.") } } } } is_valid = data_obj.timeline.date.length > 0; if (is_valid) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Finished Parsing Data"); VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, data_obj); } else { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Unable to load Google Doc data source. Make sure you have no blank rows and that the headers have not been changed."); } } }, storify: { getData: function(raw) { var key, url, storify_timeout; //http://storify.com/number10gov/g8-and-nato-chicago-summit //http://api.storify.com/v1/stories/number10gov/g8-and-nato-chicago-summit VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Loading Storify..."); key = raw.split("storify.com\/")[1]; url = "//api.storify.com/v1/stories/" + key + "?per_page=300&callback=?"; storify_timeout = setTimeout(function() { trace("STORIFY timeout"); VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Storify is not responding"); }, 6000); VMM.getJSON(url, VMM.Timeline.DataObj.model.storify.buildData) .error(function(jqXHR, textStatus, errorThrown) { trace("STORIFY error"); trace("STORIFY ERROR: " + textStatus + " " + jqXHR.responseText); }) .success(function(d) { clearTimeout(storify_timeout); }); }, buildData: function(d) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Parsing Data"); var _data_obj = VMM.Timeline.DataObj.data_template_obj; _data_obj.timeline.startDate = new Date(d.content.date.created);; _data_obj.timeline.headline = d.content.title; trace(d); //d.permalink var tt = ""; var t_name = d.content.author.username; var t_nickname = ""; if (typeof d.content.author.name != 'undefined') { t_name = d.content.author.name; t_nickname = d.content.author.username + " "; } if (typeof d.content.description != 'undefined' && d.content.description != null) { tt += d.content.description; } tt += "
" + dd.data.quote.text.replace(/<\s*\/?\s*b\s*.*?>/g,"") + ""; } } else if (dd.type == "link") { _date.headline = dd.data.link.title; _date.text = dd.data.link.description; if (dd.data.link.thumbnail != 'undefined' && dd.data.link.thumbnail != '') { _date.asset.media = dd.data.link.thumbnail; } else { _date.asset.media = dd.permalink; } //_date.asset.media = dd.permalink; _date.asset.caption = "" + dd.data.link.title + "" _date.slug = dd.data.link.title; } else if (dd.type == "text") { if (dd.permalink.match("storify")) { is_text = true; var d_name = d.content.author.username; var d_nickname = ""; if (typeof dd.attribution.name != 'undefined') { t_name = dd.attribution.name; t_nickname = dd.attribution.username + " "; } var asset_text = "
"; //asset_text += " " + "" + " "; asset_text += "" + dd.data.text.replace(/<\s*\/?\s*b\s*.*?>/g,"") + "