/*! TimelineJS Designed and built by Zach Wise at VéritéCo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. http://www.gnu.org/licenses/ */ /*********************************************** Begin VMM.js ***********************************************/ /* Verite * Verite JS Master * Version: 0.6 * Date: April 26, 2012 * Copyright 2012 Verite unless part of Verite Timeline, * if part of Timeline then it inherits Timeline's license. * Designed and built by Zach Wise digitalartwork.net * ----------------------------------------------------- */ /* Simple JavaScript Inheritance * By John Resig http://ejohn.org/ * MIT Licensed. ================================================== */ (function() { var initializing = false, fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/: /.*/; // The base Class implementation (does nothing) this.Class = function() {}; // Create a new Class that inherits from this class Class.extend = function(prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this(); initializing = false; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) { return function() { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we're done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if (!initializing && this.init) this.init.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.prototype.constructor = Class; // And make this class extendable Class.extend = arguments.callee; return Class; }; })(); /* Access to the Global Object * access the global object without hard-coding the identifier window ================================================== */ var global = (function () { return this || (1,eval)('this'); }()); /* VMM ================================================== */ if (typeof VMM == 'undefined') { /* Main Scope Container ================================================== */ //var VMM = {}; var VMM = Class.extend({}); /* Debug ================================================== */ VMM.debug = true; /* Master Config ================================================== */ VMM.master_config = ({ init: function() { return this; }, sizes: { api: { width: 0, height: 0 } }, vp: "Pellentesque nibh felis, eleifend id, commodo in, interdum vitae, leo", api_keys_master: { flickr: "RAIvxHY4hE/Elm5cieh4X5ptMyDpj7MYIxziGxi0WGCcy1s+yr7rKQ==", google: "jwNGnYw4hE9lmAez4ll0QD+jo6SKBJFknkopLS4FrSAuGfIwyj57AusuR0s8dAo=", twitter: "" }, flickr: { active: false, array: [], api_loaded: false, que: [] }, youtube: { active: false, array: [], api_loaded: false, que: [] }, vimeo: { active: false, array: [], api_loaded: false, que: [] }, googlemaps: { active: false, map_active: false, places_active: false, array: [], api_loaded: false, que: [] }, googledocs: { active: false, array: [], api_loaded: false, que: [] }, googleplus: { active: false, array: [], api_loaded: false, que: [] }, wikipedia: { active: false, array: [], api_loaded: false, que: [] }, soundcloud: { active: false, array: [], api_loaded: false, que: [] } }).init(); //VMM.createElement(tag, value, cName, attrs, styles); VMM.createElement = function(tag, value, cName, attrs, styles) { var ce = ""; if (tag != null && tag != "") { // TAG ce += "<" + tag; if (cName != null && cName != "") { ce += " class='" + cName + "'"; }; if (attrs != null && attrs != "") { ce += " " + attrs; }; if (styles != null && styles != "") { ce += " style='" + styles + "'"; }; ce += ">"; if (value != null && value != "") { ce += value; } // CLOSE TAG ce = ce + ""; } return ce; }; VMM.createMediaElement = function(media, caption, credit) { var ce = ""; var _valid = false; ce += "
"; if (media != null && media != "") { valid = true; ce += ""; // CREDIT if (credit != null && credit != "") { ce += VMM.createElement("div", credit, "credit"); } // CAPTION if (caption != null && caption != "") { ce += VMM.createElement("div", caption, "caption"); } } ce += "
"; return ce; }; // Hide URL Bar for iOS and Android by Scott Jehl // https://gist.github.com/1183357 VMM.hideUrlBar = function () { var win = window, doc = win.document; // If there's a hash, or addEventListener is undefined, stop here if( !location.hash || !win.addEventListener ){ //scroll to 1 window.scrollTo( 0, 1 ); var scrollTop = 1, //reset to 0 on bodyready, if needed bodycheck = setInterval(function(){ if( doc.body ){ clearInterval( bodycheck ); scrollTop = "scrollTop" in doc.body ? doc.body.scrollTop : 1; win.scrollTo( 0, scrollTop === 1 ? 0 : 1 ); } }, 15 ); win.addEventListener( "load", function(){ setTimeout(function(){ //reset to hide addr bar at onload win.scrollTo( 0, scrollTop === 1 ? 0 : 1 ); }, 0); }, false ); } }; } /* Trace (console.log) ================================================== */ function trace( msg ) { if (VMM.debug) { if (window.console) { console.log(msg); } else if ( typeof( jsTrace ) != 'undefined' ) { jsTrace.send( msg ); } else { //alert(msg); } } } /* Extending Date to include Week ================================================== */ Date.prototype.getWeek = function() { var onejan = new Date(this.getFullYear(),0,1); return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7); } /* Extending Date to include Day of Year ================================================== */ Date.prototype.getDayOfYear = function() { var onejan = new Date(this.getFullYear(),0,1); return Math.ceil((this - onejan) / 86400000); } /* A MORE SPECIFIC TYPEOF(); // http://rolandog.com/archives/2007/01/18/typeof-a-more-specific-typeof/ ================================================== */ // type.of() var is={ Null:function(a){return a===null;}, Undefined:function(a){return a===undefined;}, nt:function(a){return(a===null||a===undefined);}, Function:function(a){return(typeof(a)==="function")?a.constructor.toString().match(/Function/)!==null:false;}, String:function(a){return(typeof(a)==="string")?true:(typeof(a)==="object")?a.constructor.toString().match(/string/i)!==null:false;}, Array:function(a){return(typeof(a)==="object")?a.constructor.toString().match(/array/i)!==null||a.length!==undefined:false;}, Boolean:function(a){return(typeof(a)==="boolean")?true:(typeof(a)==="object")?a.constructor.toString().match(/boolean/i)!==null:false;}, Date:function(a){return(typeof(a)==="date")?true:(typeof(a)==="object")?a.constructor.toString().match(/date/i)!==null:false;}, HTML:function(a){return(typeof(a)==="object")?a.constructor.toString().match(/html/i)!==null:false;}, Number:function(a){return(typeof(a)==="number")?true:(typeof(a)==="object")?a.constructor.toString().match(/Number/)!==null:false;}, Object:function(a){return(typeof(a)==="object")?a.constructor.toString().match(/object/i)!==null:false;}, RegExp:function(a){return(typeof(a)==="function")?a.constructor.toString().match(/regexp/i)!==null:false;} }; var type={ of:function(a){ for(var i in is){ if(is[i](a)){ return i.toLowerCase(); } } } }; /*********************************************** Begin VMM.Library.js ***********************************************/ /* LIBRARY ABSTRACTION ================================================== */ if(typeof VMM != 'undefined') { VMM.attachElement = function(element, content) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).html(content); } }; VMM.appendElement = function(element, content) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).append(content); } }; VMM.getHTML = function(element) { var e; if( typeof( jQuery ) != 'undefined' ){ e = jQuery(element).html(); return e; } }; VMM.getElement = function(element, p) { var e; if( typeof( jQuery ) != 'undefined' ){ if (p) { e = jQuery(element).parent().get(0); } else { e = jQuery(element).get(0); } return e; } }; VMM.bindEvent = function(element, the_handler, the_event_type, event_data) { var e; var _event_type = "click"; var _event_data = {}; if (the_event_type != null && the_event_type != "") { _event_type = the_event_type; } if (_event_data != null && _event_data != "") { _event_data = event_data; } if( typeof( jQuery ) != 'undefined' ){ jQuery(element).bind(_event_type, _event_data, the_handler); //return e; } }; VMM.unbindEvent = function(element, the_handler, the_event_type) { var e; var _event_type = "click"; var _event_data = {}; if (the_event_type != null && the_event_type != "") { _event_type = the_event_type; } if( typeof( jQuery ) != 'undefined' ){ jQuery(element).unbind(_event_type, the_handler); //return e; } }; VMM.fireEvent = function(element, the_event_type, the_data) { var e; var _event_type = "click"; var _data = []; if (the_event_type != null && the_event_type != "") { _event_type = the_event_type; } if (the_data != null && the_data != "") { _data = the_data; } if( typeof( jQuery ) != 'undefined' ){ jQuery(element).trigger(_event_type, _data); //return e; } }; VMM.getJSON = function(url, data, callback) { if( typeof( jQuery ) != 'undefined' ){ /* CHECK FOR IE ================================================== */ if ( VMM.Browser.browser == "Explorer" && parseInt(VMM.Browser.version, 10) >= 7 && window.XDomainRequest) { trace("IE JSON"); var ie_url = url; if (ie_url.match('^http://')){ return jQuery.getJSON(ie_url, data, callback); } else if (ie_url.match('^https://')) { ie_url = ie_url.replace("https://","http://"); return jQuery.getJSON(ie_url, data, callback); } else { return jQuery.getJSON(url, data, callback); } } else { return jQuery.getJSON(url, data, callback); } } } VMM.parseJSON = function(the_json) { if( typeof( jQuery ) != 'undefined' ){ return jQuery.parseJSON(the_json); } } // ADD ELEMENT AND RETURN IT VMM.appendAndGetElement = function(append_to_element, tag, cName, content) { var e, _tag = "
", _class = "", _content = "", _id = ""; if (tag != null && tag != "") { _tag = tag; } if (cName != null && cName != "") { _class = cName; } if (content != null && content != "") { _content = content; } if( typeof( jQuery ) != 'undefined' ){ e = jQuery(tag); e.addClass(_class); e.html(_content); jQuery(append_to_element).append(e); } return e; }; VMM.Lib = { init: function() { return this; }, hide: function(element, duration) { if (duration != null && duration != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).hide(duration); } } else { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).hide(); } } }, remove: function(element) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).remove(); } }, detach: function(element) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).detach(); } }, append: function(element, value) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).append(value); } }, prepend: function(element, value) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).prepend(value); } }, show: function(element, duration) { if (duration != null && duration != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).show(duration); } } else { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).show(); } } }, load: function(element, callback_function, event_data) { var _event_data = {elem:element}; // return element by default if (_event_data != null && _event_data != "") { _event_data = event_data; } if( typeof( jQuery ) != 'undefined' ){ jQuery(element).load(_event_data, callback_function); } }, addClass: function(element, cName) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).addClass(cName); } }, removeClass: function(element, cName) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).removeClass(cName); } }, attr: function(element, aName, value) { if (value != null && value != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).attr(aName, value); } } else { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).attr(aName); } } }, prop: function(element, aName, value) { if (typeof jQuery == 'undefined' || !/[1-9]\.[3-9].[1-9]/.test(jQuery.fn.jquery)) { VMM.Lib.attribute(element, aName, value); } else { jQuery(element).prop(aName, value); } }, attribute: function(element, aName, value) { if (value != null && value != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).attr(aName, value); } } else { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).attr(aName); } } }, visible: function(element, show) { if (show != null) { if( typeof( jQuery ) != 'undefined' ){ if (show) { jQuery(element).show(0); } else { jQuery(element).hide(0); } } } else { if( typeof( jQuery ) != 'undefined' ){ if ( jQuery(element).is(':visible')){ return true; } else { return false; } } } }, css: function(element, prop, value) { if (value != null && value != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).css(prop, value); } } else { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).css(prop); } } }, cssmultiple: function(element, propval) { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).css(propval); } }, offset: function(element) { var p; if( typeof( jQuery ) != 'undefined' ){ p = jQuery(element).offset(); } return p; }, position: function(element) { var p; if( typeof( jQuery ) != 'undefined' ){ p = jQuery(element).position(); } return p; }, width: function(element, s) { if (s != null && s != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).width(s); } } else { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).width(); } } }, height: function(element, s) { if (s != null && s != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).height(s); } } else { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).height(); } } }, toggleClass: function(element, cName) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).toggleClass(cName); } }, each:function(element, return_function) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).each(return_function); } }, html: function(element, str) { var e; if( typeof( jQuery ) != 'undefined' ){ e = jQuery(element).html(); return e; } if (str != null && str != "") { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).html(str); } } else { var e; if( typeof( jQuery ) != 'undefined' ){ e = jQuery(element).html(); return e; } } }, find: function(element, selec) { if( typeof( jQuery ) != 'undefined' ){ return jQuery(element).find(selec); } }, stop: function(element) { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).stop(); } }, delay_animate: function(delay, element, duration, ease, att, callback_function) { if (VMM.Browser.device == "mobile" || VMM.Browser.device == "tablet") { var _tdd = Math.round((duration/1500)*10)/10, __duration = _tdd + 's'; VMM.Lib.css(element, '-webkit-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-moz-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-o-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-ms-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, 'transition', 'all '+ __duration + ' ease'); VMM.Lib.cssmultiple(element, _att); } else { if( typeof( jQuery ) != 'undefined' ){ jQuery(element).delay(delay).animate(att, {duration:duration, easing:ease} ); } } }, animate: function(element, duration, ease, att, que, callback_function) { var _ease = "easein", _que = false, _duration = 1000, _att = {}; if (duration != null) { if (duration < 1) { _duration = 1; } else { _duration = Math.round(duration); } } if (ease != null && ease != "") { _ease = ease; } if (que != null && que != "") { _que = que; } if (att != null) { _att = att } else { _att = {opacity: 0} } if (VMM.Browser.device == "mobile" || VMM.Browser.device == "tablet") { var _tdd = Math.round((_duration/1500)*10)/10, __duration = _tdd + 's'; VMM.Lib.css(element, '-webkit-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-moz-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-o-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, '-ms-transition', 'all '+ __duration + ' ease'); VMM.Lib.css(element, 'transition', 'all '+ __duration + ' ease'); VMM.Lib.cssmultiple(element, _att); //callback_function(); /* if( typeof( jQuery ) != 'undefined' ){ if (callback_function != null && callback_function != "") { jQuery(element).animate(_att, {queue:false, duration:_duration, easing:_ease, complete:callback_function} ); } else { jQuery(element).animate(_att, {queue:false, duration:_duration, easing:_ease} ); } } */ } else { if( typeof( jQuery ) != 'undefined' ){ if (callback_function != null && callback_function != "") { jQuery(element).animate(_att, {queue:_que, duration:_duration, easing:_ease, complete:callback_function} ); } else { jQuery(element).animate(_att, {queue:_que, duration:_duration, easing:_ease} ); } } } }, } } if( typeof( jQuery ) != 'undefined' ){ /* XDR AJAX EXTENTION FOR jQuery https://github.com/jaubourg/ajaxHooks/blob/master/src/ajax/xdr.js ================================================== */ (function( jQuery ) { if ( window.XDomainRequest ) { jQuery.ajaxTransport(function( s ) { if ( s.crossDomain && s.async ) { if ( s.timeout ) { s.xdrTimeout = s.timeout; delete s.timeout; } var xdr; return { send: function( _, complete ) { function callback( status, statusText, responses, responseHeaders ) { xdr.onload = xdr.onerror = xdr.ontimeout = jQuery.noop; xdr = undefined; complete( status, statusText, responses, responseHeaders ); } xdr = new XDomainRequest(); xdr.open( s.type, s.url ); xdr.onload = function() { callback( 200, "OK", { text: xdr.responseText }, "Content-Type: " + xdr.contentType ); }; xdr.onerror = function() { callback( 404, "Not Found" ); }; if ( s.xdrTimeout ) { xdr.ontimeout = function() { callback( 0, "timeout" ); }; xdr.timeout = s.xdrTimeout; } xdr.send( ( s.hasContent && s.data ) || null ); }, abort: function() { if ( xdr ) { xdr.onerror = jQuery.noop(); xdr.abort(); } } }; } }); } })( jQuery ); /* jQuery Easing v1.3 http://gsgd.co.uk/sandbox/jquery/easing/ ================================================== */ jQuery.easing['jswing'] = jQuery.easing['swing']; jQuery.extend( jQuery.easing, { def: 'easeOutQuad', swing: function (x, t, b, c, d) { //alert(jQuery.easing.default); return jQuery.easing[jQuery.easing.def](x, t, b, c, d); }, easeInExpo: function (x, t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; }, easeOutExpo: function (x, t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, easeInOutExpo: function (x, t, b, c, d) { if (t==0) return b; if (t==d) return b+c; if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInQuad: function (x, t, b, c, d) { return c*(t/=d)*t + b; }, easeOutQuad: function (x, t, b, c, d) { return -c *(t/=d)*(t-2) + b; }, easeInOutQuad: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }, }); } /*********************************************** Begin VMM.Browser.js ***********************************************/ /* DEVICE AND BROWSER DETECTION ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Browser == 'undefined') { VMM.Browser = { init: function () { this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version"; this.OS = this.searchString(this.dataOS) || "an unknown OS"; this.device = this.searchDevice(navigator.userAgent); this.orientation = this.searchOrientation(window.orientation); }, searchOrientation: function(orientation) { if ( orientation == 0 || orientation == 180) { return "portrait"; } else if ( orientation == 90 || orientation == -90) { return "landscape"; } else { return "normal"; } }, searchDevice: function(d) { if (d.match(/Android/i) || d.match(/iPhone|iPod/i)) { return "mobile"; } else if (d.match(/iPad/i)) { return "tablet"; } else if (d.match(/BlackBerry/i) || d.match(/IEMobile/i)) { return "other mobile"; } else { return "desktop"; } }, searchString: function (data) { for (var i=0;i'mmmm d',' yyyy''", full_long: "mmm d',' yyyy 'at' hh:MM TT", full_long_small_date: "hh:MM TT'
mmm d',' yyyy''", }, month: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], month_abbr: ["Jan.", "Feb.", "March", "April", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."], day: ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], day_abbr: ["Sun.","Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat."], hour: [1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12], hour_suffix: ["am"], //B.C. bc_format: { year: "yyyy", month_short: "mmm", month: "mmmm yyyy", full_short: "mmm d", full: "mmmm d',' yyyy", time_no_seconds_short: "h:MM TT", time_no_seconds_small_date: "dddd', 'h:MM TT'
'mmmm d',' yyyy''", full_long: "dddd',' mmm d',' yyyy 'at' hh:MM TT", full_long_small_date: "hh:MM TT'
'dddd',' mmm d',' yyyy''", }, setLanguage: function(lang) { trace("SET DATE LANGUAGE"); VMM.Date.dateformats = lang.dateformats; VMM.Date.month = lang.date.month; VMM.Date.month_abbr = lang.date.month_abbr; VMM.Date.day = lang.date.day; VMM.Date.day_abbr = lang.date.day_abbr; dateFormat.i18n.dayNames = lang.date.day_abbr.concat(lang.date.day); dateFormat.i18n.monthNames = lang.date.month_abbr.concat(lang.date.month); }, parse: function(d) { if (type.of(d) == "date") { return d; } else { var _date = new Date(0, 0, 1, 0, 0, 0, 0); var _d_array, _t_array; var _time_parse, _times; if ( d.match(/,/gi) ) { _d_array = d.split(","); for(var i = 0; i < _d_array.length; i++) { _d_array[i] = parseInt(_d_array[i]); } if ( _d_array[0] ) { _date.setFullYear( _d_array[0]); } if ( _d_array[1] > 1 ) { _date.setMonth( _d_array[1] - 1); } if ( _d_array[2] > 1 ) { _date.setDate( _d_array[2]); } if ( _d_array[3] > 1 ) { _date.setHours( _d_array[3]); } if ( _d_array[4] > 1 ) { _date.setMinutes( _d_array[4]); } if ( _d_array[5] > 1 ) { _date.setSeconds( _d_array[5]); } if ( _d_array[6] > 1 ) { _date.setMilliseconds( _d_array[6]); } } else if (d.match("/")) { if (d.match(" ")) { _time_parse = d.split(" "); if (d.match(":")) { _t_array = _time_parse[1].split(":"); if ( _t_array[0] >= 1 ) { _date.setHours( _t_array[0]); } if ( _t_array[1] >= 1 ) { _date.setMinutes( _t_array[1]); } if ( _t_array[2] >= 1 ) { _date.setSeconds( _t_array[2]); } if ( _t_array[3] >= 1 ) { _date.setMilliseconds( _t_array[3]); } } _d_array = _time_parse[0].split("/"); } else { _d_array = d.split("/"); } if ( _d_array[2] ) { _date.setFullYear( _d_array[2]); } if ( _d_array[0] > 1 ) { _date.setMonth( _d_array[0] - 1); } if ( _d_array[1] > 1 ) { _date.setDate( _d_array[1]); } } else if (d.length <= 5) { _date.setFullYear(parseInt(d)); _date.setMonth(0); _date.setDate(1); _date.setHours(0); _date.setMinutes(0); _date.setSeconds(0); _date.setMilliseconds(0); } else if (d.match("T")) { if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) { // IE 8 < Won't accept dates with a "-" in them. _time_parse = d.split("T"); if (d.match(":")) { _t_array = _time_parse[1].split(":"); if ( _t_array[0] >= 1 ) { _date.setHours( _t_array[0]); } if ( _t_array[1] >= 1 ) { _date.setMinutes( _t_array[1]); } if ( _t_array[2] >= 1 ) { _date.setSeconds( _t_array[2]); } if ( _t_array[3] >= 1 ) { _date.setMilliseconds( _t_array[3]); } } _d_array = _time_parse[0].split("-"); if ( _d_array[0] ) { _date.setFullYear( _d_array[0]); } if ( _d_array[1] > 1 ) { _date.setMonth( _d_array[1] - 1); } if ( _d_array[2] > 1 ) { _date.setDate( _d_array[2]); } } else { _date = new Date(Date.parse(d)); } } else { _date = new Date( parseInt(d.slice(0,4)), parseInt(d.slice(4,6)) - 1, parseInt(d.slice(6,8)), parseInt(d.slice(8,10)), parseInt(d.slice(10,12)) ); } return _date; } }, prettyDate: function(d, is_abbr, d2) { var _date; var _date2; var format; var bc_check; var is_pair = false; if (d2 != null) { is_pair = true; } if (type.of(d) == "date") { if (d.getMonth() === 0 && d.getDate() == 1 && d.getHours() === 0 && d.getMinutes() === 0 ) { // YEAR ONLY format = VMM.Date.dateformats.year; } else if (d.getDate() <= 1 && d.getHours() === 0 && d.getMinutes() === 0) { // YEAR MONTH if (is_abbr) { format = VMM.Date.dateformats.month_short; } else { format = VMM.Date.dateformats.month; } } else if (d.getHours() === 0 && d.getMinutes() === 0) { // YEAR MONTH DAY if (is_abbr) { format = VMM.Date.dateformats.full_short; } else { format = VMM.Date.dateformats.full; } } else if (d.getMinutes() === 0) { // YEAR MONTH DAY HOUR if (is_abbr) { format = VMM.Date.dateformats.time_no_seconds_short; } else { format = VMM.Date.dateformats.time_no_seconds_small_date; } } else { // YEAR MONTH DAY HOUR MINUTE if (is_abbr){ format = VMM.Date.dateformats.time_no_seconds_short; } else { format = VMM.Date.dateformats.full_long; } } _date = dateFormat(d, format); bc_check = _date.split(" "); // BC TIME SUPPORT for(var i = 0; i < bc_check.length; i++) { if ( parseInt(bc_check[i]) < 0 ) { trace("YEAR IS BC"); var bc_original = bc_check[i]; var bc_number = Math.abs( parseInt(bc_check[i]) ); var bc_string = bc_number.toString() + " B.C."; _date = _date.replace(bc_original, bc_string); } } if (is_pair) { _date2 = dateFormat(d2, format); bc_check = _date2.split(" "); // BC TIME SUPPORT for(var i = 0; i < bc_check.length; i++) { if ( parseInt(bc_check[i]) < 0 ) { trace("YEAR IS BC"); var bc_original = bc_check[i]; var bc_number = Math.abs( parseInt(bc_check[i]) ); var bc_string = bc_number.toString() + " B.C."; _date2 = _date2.replace(bc_original, bc_string); } } } } else { trace("NOT A VALID DATE?"); trace(d); } if (is_pair) { return _date + " — " + _date2; } else { return _date; } } }).init(); /* * Date Format 1.2.3 * (c) 2007-2009 Steven Levithan * MIT license * * Includes enhancements by Scott Trenda * and Kris Kowal * * Accepts a date, a mask, or a date and a mask. * Returns a formatted version of the given date. * The date defaults to the current date/time. * The mask defaults to dateFormat.masks.default. */ var dateFormat = function () { var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function (val, len) { val = String(val); len = len || 2; while (val.length < len) val = "0" + val; return val; }; // Regexes and supporting functions are cached through closure return function (date, mask, utc) { var dF = dateFormat; // You can't provide utc if you skip other args (use the "UTC:" mask prefix) if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { mask = date; date = undefined; } // Passing date through Date applies Date.parse, if necessary date = date ? new Date(date) : new Date; if (isNaN(date)) { trace("invalid date"); return ""; } mask = String(dF.masks[mask] || mask || dF.masks["default"]); // Allow setting the utc argument via the mask if (mask.slice(0, 4) == "UTC:") { mask = mask.slice(4); utc = true; } var _ = utc ? "getUTC" : "get", d = date[_ + "Date"](), D = date[_ + "Day"](), m = date[_ + "Month"](), y = date[_ + "FullYear"](), H = date[_ + "Hours"](), M = date[_ + "Minutes"](), s = date[_ + "Seconds"](), L = date[_ + "Milliseconds"](), o = utc ? 0 : date.getTimezoneOffset(), flags = { d: d, dd: pad(d), ddd: dF.i18n.dayNames[D], dddd: dF.i18n.dayNames[D + 7], m: m + 1, mm: pad(m + 1), mmm: dF.i18n.monthNames[m], mmmm: dF.i18n.monthNames[m + 12], yy: String(y).slice(2), yyyy: y, h: H % 12 || 12, hh: pad(H % 12 || 12), H: H, HH: pad(H), M: M, MM: pad(M), s: s, ss: pad(s), l: pad(L, 3), L: pad(L > 99 ? Math.round(L / 10) : L), t: H < 12 ? "a" : "p", tt: H < 12 ? "am" : "pm", T: H < 12 ? "A" : "P", TT: H < 12 ? "AM" : "PM", Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] }; return mask.replace(token, function ($0) { return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); }); }; }(); // Some common format strings dateFormat.masks = { "default": "ddd mmm dd yyyy HH:MM:ss", shortDate: "m/d/yy", mediumDate: "mmm d, yyyy", longDate: "mmmm d, yyyy", fullDate: "dddd, mmmm d, yyyy", shortTime: "h:MM TT", mediumTime: "h:MM:ss TT", longTime: "h:MM:ss TT Z", isoDate: "yyyy-mm-dd", isoTime: "HH:MM:ss", isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" }; // Internationalization strings dateFormat.i18n = { dayNames: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], monthNames: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] }; // For convenience... Date.prototype.format = function (mask, utc) { return dateFormat(this, mask, utc); }; } /*********************************************** Begin VMM.Util.js ***********************************************/ /* Utilities and Useful Functions ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Util == 'undefined') { VMM.Util = ({ init: function() { return this; }, /* CORRECT PROTOCOL (DOES NOT WORK) ================================================== */ correctProtocol: function(url) { var loc = (window.parent.location.protocol).toString(); var prefix = ""; var _url = url.split("://", 2); if (loc.match("http")) { prefix = loc; } else { prefix = "https"; } return prefix + "://" + _url[1]; }, /* GET OBJECT ATTRIBUTE BY INDEX ================================================== */ getObjectAttributeByIndex: function(obj, index) { if(typeof obj != 'undefined') { var i = 0; for (var attr in obj){ if (index === i){ return obj[attr]; } i++; } return ""; } else { return ""; } }, /* RANDOM BETWEEN ================================================== */ //VMM.Util.randomBetween(1, 3) randomBetween: function(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); }, /* AVERAGE http://jsfromhell.com/array/average var x = VMM.Util.average([2, 3, 4]); VMM.Util.average([2, 3, 4]).mean ================================================== */ average: function(a) { var r = {mean: 0, variance: 0, deviation: 0}, t = a.length; for(var m, s = 0, l = t; l--; s += a[l]); for(m = r.mean = s / t, l = t, s = 0; l--; s += Math.pow(a[l] - m, 2)); return r.deviation = Math.sqrt(r.variance = s / t), r; }, /* CUSTOM SORT ================================================== */ customSort: function(a, b) { var a1= a, b1= b; if(a1== b1) return 0; return a1> b1? 1: -1; }, /* Remove Duplicates from Array ================================================== */ deDupeArray: function(arr) { var i, len=arr.length, out=[], obj={}; for (i=0;i h) { _fit.height = h; //_fit.width = Math.round((w / ratio_w) * ratio_h); _fit.width = Math.round((h / ratio_h) * ratio_w); if (_fit.width > w) { trace("FIT: DIDN'T FIT!!! ") } } return _fit; }, r16_9: function(w,h) { //VMM.Util.ratio.r16_9(w, h) // Returns corresponding number if (w !== null && w !== "") { return Math.round((h / 16) * 9); } else if (h !== null && h !== "") { return Math.round((w / 9) * 16); } }, r4_3: function(w,h) { if (w !== null && w !== "") { return Math.round((h / 4) * 3); } else if (h !== null && h !== "") { return Math.round((w / 3) * 4); } } }, doubledigit: function(n) { return (n < 10 ? '0' : '') + n; }, /* Returns a truncated segement of a long string of between min and max words. If possible, ends on a period (otherwise goes to max). ================================================== */ truncateWords: function(s, min, max) { if (!min) min = 30; if (!max) max = min; var initial_whitespace_rExp = /^[^A-Za-z0-9\'\-]+/gi; var left_trimmedStr = s.replace(initial_whitespace_rExp, ""); var words = left_trimmedStr.split(" "); var result = []; min = Math.min(words.length, min); max = Math.min(words.length, max); for (var i = 0; i$&") .replace(pseudoUrlPattern, "$1$2") .replace(emailAddressPattern, "$1"); }, linkify_with_twitter: function(text,targets,is_touch) { // http://, https://, ftp:// var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim; var url_pattern = /(\()((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\))|(\[)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\])|(\{)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\})|(<|&(?:lt|#60|#x3c);)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(>|&(?:gt|#62|#x3e);)|((?:^|[^=\s'"\]])\s*['"]?|[^=\s]\s+)(\b(?:ht|f)tps?:\/\/[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]+(?:(?!&(?:gt|#0*62|#x0*3e);|&(?:amp|apos|quot|#0*3[49]|#x0*2[27]);[.!&',:?;]?(?:[^a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]|$))&[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]*)*[a-z0-9\-_~$()*+=\/#[\]@%])/img; var url_replace = '$1$4$7$10$13$2$5$8$11$14$3$6$9$12'; // www. sans http:// or https:// var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim; function replaceURLWithHTMLLinks(text) { var exp = /(\b(https?|ftp|file):\/\/([-A-Z0-9+&@#%?=~_|!:,.;]*)([-A-Z0-9+&@#%?\/=~_|!:,.;]*)[-A-Z0-9+&@#\/%=~_|])/ig; return text.replace(exp, "$3"); } // Email addresses var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim; //var twitterHandlePattern = /(@([\w]+))/g; var twitterHandlePattern = /\B@([\w-]+)/gm; var twitterSearchPattern = /(#([\w]+))/g; return text //.replace(urlPattern, "$&") .replace(url_pattern, url_replace) .replace(pseudoUrlPattern, "$1$2") .replace(emailAddressPattern, "$1") .replace(twitterHandlePattern, "@$1") .replace(twitterSearchPattern, "$1"); }, linkify_wikipedia: function(text) { var urlPattern = /]*>(.*?)<\/i>/gim; return text .replace(urlPattern, "$&") .replace(/]*>/gim, "") .replace(/<\/i>/gim, "") .replace(/]*>/gim, "") .replace(/<\/b>/gim, ""); }, /* Turns plain text links into real links ================================================== */ // VMM.Util.unlinkify(); unlinkify: function(text) { if(!text) return text; text = text.replace(/]*>/i,""); text = text.replace(/<\/a>/i, ""); return text; }, untagify: function(text) { if (!text) { return text; } text = text.replace(/<\s*\w.*?>/g,""); return text; }, /* TK ================================================== */ nl2br: function(text) { return text.replace(/(\r\n|[\r\n]|\\n|\\r)/g,"
"); }, /* Generate a Unique ID ================================================== */ // VMM.Util.unique_ID(size); unique_ID: function(size) { var getRandomNumber = function(range) { return Math.floor(Math.random() * range); }; var getRandomChar = function() { var chars = "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ"; return chars.substr( getRandomNumber(62), 1 ); }; var randomID = function(size) { var str = ""; for(var i = 0; i < size; i++) { str += getRandomChar(); } return str; }; return randomID(size); }, /* Tells you if a number is even or not ================================================== */ // VMM.Util.isEven(n) isEven: function(n){ return (n%2 === 0) ? true : false; }, /* Get URL Variables ================================================== */ // var somestring = VMM.Util.getUrlVars(str_url)["varname"]; getUrlVars: function(string) { var str = string.toString(); if (str.match('&')) { str = str.replace("&", "&"); } else if (str.match('&')) { str = str.replace("&", "&"); } else if (str.match('&')) { str = str.replace("&", "&"); } var vars = [], hash; var hashes = str.slice(str.indexOf('?') + 1).split('&'); for(var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; }, /* Cleans up strings to become real HTML ================================================== */ toHTML: function(text) { text = this.nl2br(text); text = this.linkify(text); return text.replace(/\s\s/g,"  "); }, /* Returns text strings as CamelCase ================================================== */ toCamelCase: function(s,forceLowerCase) { if(forceLowerCase !== false) forceLowerCase = true; var sps = ((forceLowerCase) ? s.toLowerCase() : s).split(" "); for(var i=0; i= 7) { return t.replace("_", "%20"); } else { var __TitleCase = { __smallWords: ['a', 'an', 'and', 'as', 'at', 'but','by', 'en', 'for', 'if', 'in', 'of', 'on', 'or','the', 'to', 'v[.]?', 'via', 'vs[.]?'], init: function() { this.__smallRE = this.__smallWords.join('|'); this.__lowerCaseWordsRE = new RegExp('\\b(' + this.__smallRE + ')\\b', 'gi'); this.__firstWordRE = new RegExp('^([^a-zA-Z0-9 \\r\\n\\t]*)(' + this.__smallRE + ')\\b', 'gi'); this.__lastWordRE = new RegExp('\\b(' + this.__smallRE + ')([^a-zA-Z0-9 \\r\\n\\t]*)$', 'gi'); }, toTitleCase: function(string) { var line = ''; var split = string.split(/([:.;?!][ ]|(?:[ ]|^)["“])/); for (var i = 0; i < split.length; ++i) { var s = split[i]; s = s.replace(/\b([a-zA-Z][a-z.'’]*)\b/g,this.__titleCaseDottedWordReplacer); // lowercase the list of small words s = s.replace(this.__lowerCaseWordsRE, this.__lowerReplacer); // if the first word in the title is a small word then capitalize it s = s.replace(this.__firstWordRE, this.__firstToUpperCase); // if the last word in the title is a small word, then capitalize it s = s.replace(this.__lastWordRE, this.__firstToUpperCase); line += s; } // special cases line = line.replace(/ V(s?)\. /g, ' v$1. '); line = line.replace(/(['’])S\b/g, '$1s'); line = line.replace(/\b(AT&T|Q&A)\b/ig, this.__upperReplacer); return line; }, __titleCaseDottedWordReplacer: function (w) { return (w.match(/[a-zA-Z][.][a-zA-Z]/)) ? w : __TitleCase.__firstToUpperCase(w); }, __lowerReplacer: function (w) { return w.toLowerCase() }, __upperReplacer: function (w) { return w.toUpperCase() }, __firstToUpperCase: function (w) { var split = w.split(/(^[^a-zA-Z0-9]*[a-zA-Z0-9])(.*)$/); if (split[1]) { split[1] = split[1].toUpperCase(); } return split.join(''); }, }; __TitleCase.init(); t = t.replace(/_/g," "); t = __TitleCase.toTitleCase(t); return t; } }, }).init(); } /*********************************************** Begin VMM.LoadLib.js ***********************************************/ /* LoadLib Based on LazyLoad by Ryan Grove https://github.com/rgrove/lazyload/ Copyright (c) 2011 Ryan Grove All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ================================================== */ window.loadedJS = []; if(typeof VMM != 'undefined' && typeof VMM.LoadLib == 'undefined') { //VMM.LoadLib.js('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', onJQueryLoaded); //VMM.LoadLib.css('http://someurl.css', onCSSLoaded); VMM.LoadLib = (function (doc) { var env, head, pending = {}, pollCount = 0, queue = {css: [], js: []}, styleSheets = doc.styleSheets; var loaded_Array = []; function isLoaded(url) { var has_been_loaded = false; for(var i=0; i= 0) { if (styleSheets[i].href === css.urls[0]) { finish('css'); break; } } pollCount += 1; if (css) { if (pollCount < 200) { setTimeout(pollWebKit, 50); } else { finish('css'); } } } } return { css: function (urls, callback, obj, context) { if (isLoaded(urls)) { return callback; } else { load('css', urls, callback, obj, context); } }, js: function (urls, callback, obj, context) { if (isLoaded(urls)) { return callback; } else { load('js', urls, callback, obj, context); } } }; })(this.document); } /*********************************************** Begin VMM.ExternalAPI.js ***********************************************/ /* 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(); } if (VMM.master_config.googleplus.active) { VMM.ExternalAPI.googleplus.pushQue(); } if (VMM.master_config.wikipedia.active) { VMM.ExternalAPI.wikipedia.pushQue(); } if (VMM.master_config.vimeo.active) { VMM.ExternalAPI.vimeo.pushQue(); } }, twitter: { tweetArray: [], 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) ); }, 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.Date.prettyDate(date, true); }, 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 = ""; 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"); }); } }, 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 = ""; 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, secondary) { 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=?"; 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(d) { clearTimeout(twitter_timeout); if (secondary) { VMM.ExternalAPI.twitter.secondaryMedia(d); } }); }, 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; 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 += ""; if (typeof d.entities.media != 'undefined') { if (d.entities.media[0].type == "photo") { twit += "" } } VMM.attachElement("#twitter_"+id.toString(), twit ); VMM.attachElement("#text_thumb_"+id.toString(), d.text ); }, }, googlemaps: { get: function(url, id) { var timer, api_key, map_vars; map_vars = VMM.Util.getUrlVars(url); 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" } } }, googleplus: { get: function(user, activity) { var api_key, gplus; 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 = ""; 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); } gperson_api_url = "https://www.googleapis.com/plus/v1/people/" + gplus.user + "/activities/public?alt=json&maxResults=100&fields=items(id,url)&key=" + api_key; //mediaElem = ""; mediaElem = "GOOGLE PLUS API CALL"; VMM.getJSON(gperson_api_url, function(p_data) { for(var i = 0; i < p_data.items.length; i++) { trace("loop"); if (p_data.items[i].url.split("posts/")[1] == gplus.activity) { trace("FOUND IT!!"); g_activity = p_data.items[i].id; gactivity_api_url = "https://www.googleapis.com/plus/v1/activities/" + g_activity + "?alt=json&key=" + api_key; VMM.getJSON(gactivity_api_url, function(a_data) { trace(a_data); //a_data.url //a_data.image.url //a_data.actor.displayName //a_data.provider.title //a_data.object.content //g_content += "

" + a_data.title + "

"; if (typeof a_data.annotation != 'undefined') { g_content += "
'" + a_data.annotation + "
"; g_content += a_data.object.content; } else { g_content += a_data.object.content; } if (typeof a_data.object.attachments != 'undefined') { //g_attachments += "
"; for(var k = 0; k < a_data.object.attachments.length; k++) { if (a_data.object.attachments[k].objectType == "photo") { g_attachments = "" + "" + g_attachments; } else if (a_data.object.attachments[k].objectType == "video") { g_attachments = "" + g_attachments; g_attachments += ""; } else if (a_data.object.attachments[k].objectType == "article") { g_attachments += ""; } trace(a_data.object.attachments[k]); } g_attachments = "
" + g_attachments + "
"; } //mediaElem = "
"; mediaElem = "
" + g_content + g_attachments + "
"; mediaElem += ""; VMM.attachElement("#googleplus_" + gplus.activity, mediaElem); }); break; } } }); }, pushQue: function() { 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 = []; } }, 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"; var flickr_img_size, flickr_img_thumb, flickr_size_found = false; var flickr_best_size = "Large"; 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; } flickr_img_thumb = d.sizes.size[0].source; VMM.Lib.attr("#"+flickr_large_id, "src", flickr_img_size); VMM.attachElement("#"+flickr_thumb_id, ""); }, sizes: function(s) { var _size = ""; if (s <= 75) { _size = "Thumbnail"; } else if (s <= 180) { _size = "Small"; } else if (s <= 240) { _size = "Small 320"; } else if (s <= 375) { _size = "Medium"; } else if (s <= 480) { _size = "Medium 640"; } else if (s <= 600) { _size = "Medium 800"; } else { _size = "Large"; } return _size; } }, instagram: { get: function(mid, thumb) { if (thumb) { return "http://instagr.am/p/" + mid + "/media/?size=t"; } else { return "http://instagr.am/p/" + mid + "/media/?size=" + VMM.ExternalAPI.instagram.sizes(VMM.master_config.sizes.api.height); } }, sizes: function(s) { var _size = ""; if (s <= 150) { _size = "t"; } else if (s <= 306) { _size = "m"; } else { _size = "l"; } return _size; } }, 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: { get: function(url, id, lang) { var api_obj = {url: url, id: id, lang: lang}; VMM.master_config.wikipedia.que.push(api_obj); VMM.master_config.wikipedia.active = true; }, create: function(api_obj) { 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=?"; 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 + ""; temp_text += "

Wikipedia entry unable to load using Internet Explorer 8 or below.

"; VMM.attachElement("#"+api_obj.id, temp_text ); } VMM.getJSON(the_url, function(d) { if (d.query) { var wiki_extract, wiki_title, _wiki = "", wiki_text = "", wiki_number_of_paragraphs = 1, wiki_text_array = []; wiki_extract = VMM.Util.getObjectAttributeByIndex(d.query.pages, 0).extract; wiki_title = VMM.Util.getObjectAttributeByIndex(d.query.pages, 0).title; if (wiki_extract.match("

")) { wiki_text_array = wiki_extract.split("

"); } else { wiki_text_array.push(wiki_extract); } for(var i = 0; i < wiki_text_array.length; i++) { if (i+1 <= wiki_number_of_paragraphs && i+1 < wiki_text_array.length) { wiki_text += "

" + wiki_text_array[i+1]; } } _wiki = "

" + wiki_title + "

"; _wiki += "" + VMM.master_config.language.messages.wikipedia + ""; _wiki += VMM.Util.linkify_wikipedia(wiki_text); if (wiki_extract.match("REDIRECT")) { } else { VMM.attachElement("#"+api_obj.id, _wiki ); } } }); }, 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]); } VMM.master_config.wikipedia.que = []; }, }, youtube: { get: function(id) { var url = "http://gdata.youtube.com/feeds/api/videos/" + id + "?v=2&alt=jsonc&callback=?"; 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"); }); } } // THUMBNAIL VMM.getJSON(url, VMM.ExternalAPI.youtube.createThumb); }, 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); }, createThumb: function(d) { if (typeof d.data != 'undefined') { var thumb_id = "youtube_" + d.data.id + "_thumb"; VMM.attachElement("#" + thumb_id, ""); } }, 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) { } }, vimeo: { get: function(id) { VMM.master_config.vimeo.que.push(id); VMM.master_config.vimeo.active = true; }, create: function(d) { trace("VIMEO CREATE"); // THUMBNAIL var url = "http://vimeo.com/api/v2/video/" + d + ".json"; VMM.getJSON(url, VMM.ExternalAPI.vimeo.createThumb); }, createThumb: function(d) { trace("VIMEO CREATE THUMB"); var thumb_id = "vimeo_" + d[0].id + "_thumb"; VMM.attachElement("#" + thumb_id, ""); }, pushQue: function() { 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 = []; } } } } /* 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(); } /*********************************************** Begin VMM.MediaElement.js ***********************************************/ /* MediaElement ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.MediaElement == 'undefined') { VMM.MediaElement = ({ init: function() { return this; }, thumbnail: function(data, w, h, uid) { var _w = 16, _h = 24, _uid = ""; if (w != null && w != "") {_w = w}; if (h != null && h != "") {_h = h}; if (uid != null && uid != "") {_uid = uid}; if (data.media != null && data.media != "") { var _valid = true, mediaElem = "", m = VMM.MediaType(data.media); //returns an object with .type and .id // CREATE MEDIA CODE if (m.type == "image") { mediaElem = "
"; return mediaElem; } else if (m.type == "flickr") { mediaElem = "
"; return mediaElem; } else if (m.type == "instagram") { mediaElem = "
"; return mediaElem; } else if (m.type == "youtube") { mediaElem = "
"; return mediaElem; } else if (m.type == "googledoc") { mediaElem = "
"; return mediaElem; } else if (m.type == "vimeo") { mediaElem = "
"; return mediaElem; } else if (m.type == "dailymotion") { mediaElem = "
"; return mediaElem; } else if (m.type == "twitter"){ mediaElem = "
"; return mediaElem; } else if (m.type == "twitter-ready") { mediaElem = "
"; return mediaElem; } else if (m.type == "soundcloud") { mediaElem = "
"; return mediaElem; } else if (m.type == "google-map") { mediaElem = "
"; return mediaElem; } else if (m.type == "googleplus") { mediaElem = "
"; return mediaElem; } else if (m.type == "wikipedia") { mediaElem = "
"; return mediaElem; } else if (m.type == "storify") { mediaElem = "
"; return mediaElem; } else if (m.type == "quote") { mediaElem = "
"; return mediaElem; } else if (m.type == "unknown") { if (m.id.match("blockquote")) { mediaElem = "
"; } else { mediaElem = "
"; } return mediaElem; } else if (m.type == "website") { mediaElem = "
"; return mediaElem; } else { mediaElem = "
"; return mediaElem; } } }, create: function(data, secondary) { var _valid = false, loading_messege = "

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

"; if (data.media != null && data.media != "") { var mediaElem = "", captionElem = "", creditElem = "", _id = "", isTextMedia = false, m; m = VMM.MediaType(data.media); //returns an object with .type and .id _valid = true; // CREDIT if (data.credit != null && data.credit != "") { creditElem = "
" + VMM.Util.linkify_with_twitter(data.credit, "_blank") + "
"; } // CAPTION if (data.caption != null && data.caption != "") { captionElem = "
" + VMM.Util.linkify_with_twitter(data.caption, "_blank") + "
"; } // IMAGE if (m.type == "image") { mediaElem = "
"; // FLICKR } else if (m.type == "flickr") { _id = "flickr_" + m.id; mediaElem = "
"; VMM.ExternalAPI.flickr.get(m.id, "#" + _id); // 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); // YOUTUBE } else if (m.type == "youtube") { mediaElem = "
" + loading_messege + "
"; VMM.ExternalAPI.youtube.get(m.id); // VIMEO } else if (m.type == "vimeo") { mediaElem = "
"; VMM.ExternalAPI.vimeo.get(m.id); // DAILYMOTION } else if (m.type == "dailymotion") { mediaElem = "
"; // TWITTER } else if (m.type == "twitter"){ mediaElem = ""; isTextMedia = true; VMM.ExternalAPI.twitter.prettyHTML(m.id, secondary); // 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); // 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); // GOOGLE PLUS } else if (m.type == "googleplus") { _id = "googleplus_" + m.id; mediaElem = "
" + loading_messege + "
"; isTextMedia = true; VMM.ExternalAPI.googleplus.get(m.user, m.id); // WIKIPEDIA } else if (m.type == "wikipedia") { _id = "wikipedia_" + VMM.Util.unique_ID(7); mediaElem = "
" + loading_messege + "
"; isTextMedia = true; VMM.ExternalAPI.wikipedia.get(m.id, _id, m.lang); // STORIFY } else if (m.type == "storify") { isTextMedia = true; mediaElem = "
" + m.id + "
"; // QUOTE } else if (m.type == "quote") { isTextMedia = true; mediaElem = "
" + m.id + "
"; // UNKNOWN } else if (m.type == "unknown") { trace("NO KNOWN MEDIA TYPE FOUND TRYING TO JUST PLACE THE HTML"); isTextMedia = true; mediaElem = "
" + VMM.Util.properQuotes(m.id) + "
"; // WEBSITE } else if (m.type == "website") { //mediaElem = "
"; //mediaElem = "" + ""; mediaElem = ""; // NO MATCH } else { trace("NO KNOWN MEDIA TYPE FOUND"); trace(m.type); } // WRAP THE MEDIA ELEMENT mediaElem = "
" + mediaElem + creditElem + captionElem + "
"; // RETURN if (isTextMedia) { return "
" + mediaElem + "
"; } else { return "
" + mediaElem + "
"; } }; } }).init(); } /*********************************************** Begin VMM.MediaType.js ***********************************************/ /* MediaType ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.MediaType == 'undefined') { //VMM.mediaType.youtube(d); //should return a true or false // VMM.MediaType(url); //returns an object with .type and .id VMM.MediaType = function(d) { var success = false; var media = {}; if (d.match("div class='twitter'")) { media.type = "twitter-ready"; media.id = d; success = true; } else if (d.match('(www.)?youtube|youtu\.be')) { if (d.match('v=')) { media.id = VMM.Util.getUrlVars(d)["v"]; } else if (d.match('\/embed\/')) { media.id = d.split("embed\/")[1].split(/[?&]/)[0]; } else { media.id = d.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; } media.type = "youtube"; success = true; } else if (d.match('(player.)?vimeo\.com')) { media.type = "vimeo"; media.id = d.split(/video\/|\/\/vimeo\.com\//)[1].split(/[?&]/)[0];; success = true; } else if (d.match('(www.)?dailymotion\.com')) { media.id = d.split(/video\/|\/\/dailymotion\.com\//)[1]; media.type = "dailymotion"; success = true; } else if (d.match('(player.)?soundcloud\.com')) { media.type = "soundcloud"; media.id = d; success = true; } else if (d.match('(www.)?twitter\.com') && d.match('status') ) { if (d.match("status\/")) { media.id = d.split("status\/")[1]; } else if (d.match("statuses\/")) { media.id = d.split("statuses\/")[1]; } else { media.id = ""; } media.type = "twitter"; success = true; } else if (d.match("maps.google") && !d.match("staticmap")) { media.type = "google-map"; media.id = d.split(/src=['|"][^'|"]*?['|"]/gi); success = true; } else if (d.match("plus.google")) { media.type = "googleplus"; media.id = d.split("/posts/")[1]; //https://plus.google.com/u/0/112374836634096795698/posts/bRJSvCb5mUU //https://plus.google.com/107096716333816995401/posts/J5iMpEDHWNL if (d.split("/posts/")[0].match("u/0/")) { media.user = d.split("u/0/")[1].split("/posts")[0]; } else { media.user = d.split("google.com/")[1].split("/posts/")[0]; } success = true; } else if (d.match("flickr.com/photos")) { media.type = "flickr"; media.id = d.split("photos\/")[1].split("/")[1]; media.link = d; success = true; } else if (d.match("instagr.am/p/")) { media.type = "instagram"; media.link = d; media.id = d.split("\/p\/")[1].split("/")[0]; success = true; } else if (d.match(/jpg|jpeg|png|gif/i) || d.match("staticmap") || d.match("yfrog.com") || d.match("twitpic.com")) { media.type = "image"; media.id = d; success = true; } else if (VMM.FileExtention.googleDocType(d)) { media.type = "googledoc"; media.id = d; success = true; } else if (d.match('(www.)?wikipedia\.org')) { media.type = "wikipedia"; //media.id = d.split("wiki\/")[1]; var wiki_id = d.split("wiki\/")[1].split("#")[0].replace("_", " "); media.id = wiki_id.replace(" ", "%20"); media.lang = d.split("//")[1].split(".wikipedia")[0]; success = true; } else if (d.indexOf('http://') == 0) { media.type = "website"; media.id = d; success = true; } else if (d.match('storify')) { media.type = "storify"; media.id = d; success = true; } else if (d.match('blockquote')) { media.type = "quote"; media.id = d; success = true; } else { trace("unknown media"); media.type = "unknown"; media.id = d; success = true; } if (success) { return media; } else { trace("No valid media id detected"); trace(d); } return false; } } /*********************************************** Begin VMM.Media.js ***********************************************/ /* Media ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Media == 'undefined') { // something = new VMM.Media(parent, w, h, {thedata}); VMM.Media = function(parent, w, h, thedata) { /* PRIVATE VARS ================================================== */ var data = {}; // HOLDS DATA var _valid = false; var config = { width: 720, height: 400, content_width: 720, content_height: 400, ease: "easeInOutExpo", duration: 1000, spacing: 15 }; /* ELEMENTS ================================================== */ var $media = ""; var $container = ""; var $mediacontainer = ""; var $mediaelement = ""; var layout = parent; // expecting media div if (w != null && w != "") {config.width = w}; if (h != null && h != "") {config.height = h}; /* if (typeof thedata != "undefined") { data = thedata; this.init(data); } */ /* PUBLIC FUNCTIONS ================================================== */ this.init = function(d) { if(typeof d != 'undefined') { this.setData(d); } else { trace("WAITING ON DATA"); } }; var build = function(media, caption, credit) { $media = VMM.appendAndGetElement(layout, "
", "media"); $container = VMM.appendAndGetElement($media, "
", "container"); $mediacontainer = VMM.appendAndGetElement($container, "
", "media-container"); if (data.media != null && data.media != "") { _valid = true; var m = {}; m = VMM.MediaType(data.media); //returns an object with .type and .id if (m.type == "image") { VMM.appendElement($mediacontainer, ""); } else if (m.type == "youtube") { VMM.appendElement($mediacontainer, "
"; VMM.ExternalAPI.vimeo.get(m.id); // DAILYMOTION } else if (m.type == "dailymotion") { mediaElem = "
"; // TWITTER } else if (m.type == "twitter"){ mediaElem = ""; isTextMedia = true; VMM.ExternalAPI.twitter.prettyHTML(m.id, secondary); // 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 Sound

"; VMM.ExternalAPI.soundcloud.get(m.id, _id); // GOOGLE MAPS } else if (m.type == "google-map") { _id = "googlemap_" + VMM.Util.unique_ID(7); mediaElem = "

Loading Map

"; VMM.ExternalAPI.googlemaps.get(m.id, _id); // WIKIPEDIA } else if (m.type == "wikipedia") { _id = "wikipedia_" + VMM.Util.unique_ID(7); mediaElem = "

Loading Wikipedia

"; isTextMedia = true; VMM.ExternalAPI.wikipedia.get(m.id, _id); // UNKNOWN } else if (m.type == "quote") { isTextMedia = true; mediaElem = "
" + m.id + "
"; // UNKNOWN } else if (m.type == "unknown") { trace("NO KNOWN MEDIA TYPE FOUND TRYING TO JUST PLACE THE HTML"); isTextMedia = true; mediaElem = "
" + VMM.Util.properQuotes(m.id) + "
"; // WEBSITE } else if (m.type == "website") { mediaElem = "
"; //mediaElem = "" + ""; // NO MATCH } else { trace("NO KNOWN MEDIA TYPE FOUND"); trace(m.type); } // WRAP THE MEDIA ELEMENT mediaElem = "
" + mediaElem + creditElem + captionElem + "
"; // RETURN if (isTextMedia) { return "
" + mediaElem + "
"; } else { return "
" + mediaElem + "
"; } }; */ } }).init(); } /*********************************************** Begin VMM.TouchSlider.js ***********************************************/ /* TOUCH SLIDER ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.TouchSlider == 'undefined') { // VMM.TouchSlider.createSlidePanel(touch_object, move_object, w, padding, vertical, h) ; VMM.TouchSlider = { createPanel: function(touch_object, move_object, w, padding, vertical, h) { VMM.TouchSlider.vertical = false; VMM.TouchSlider.vertical = vertical; var x = padding; VMM.TouchSlider.width = w; VMM.TouchSlider.height = h; VMM.TouchSlider.makeTouchable(touch_object, move_object); /* if (sticky != null && sticky != "") { VMM.TouchSlider.sticky = sticky; } else { VMM.TouchSlider.sticky = false; } */ // VMM.TouchSlider.sticky = sticky; }, removePanel: function(touch_object) { VMM.unbindEvent(touch_object, VMM.TouchSlider.onTouchStart, "touchstart"); VMM.unbindEvent(touch_object, VMM.TouchSlider.onTouchMove, "touchmove"); VMM.unbindEvent(touch_object, VMM.TouchSlider.onTouchEnd, "touchend"); }, makeTouchable: function(touch_object, move_object) { VMM.bindEvent(touch_object, VMM.TouchSlider.onTouchStart, "touchstart", {element: move_object}); VMM.bindEvent(touch_object, VMM.TouchSlider.onTouchMove, "touchmove", {element: move_object}); VMM.bindEvent(touch_object, VMM.TouchSlider.onTouchEnd, "touchend", {element: move_object}); }, onTouchStart: function(e) { VMM.TouchSlider.touchStart(e.data.element, e); e.stopPropagation(); return true; }, onTouchEnd: function(e) { e.stopPropagation(); if (VMM.TouchSlider.sliding) { VMM.TouchSlider.sliding = false; VMM.TouchSlider.touchEnd(e.data.element, e); return false; } else { return true; } }, onTouchMove: function(e) { VMM.TouchSlider.touchMove(e.data.element, e); e.preventDefault(); e.stopPropagation(); return false; }, getLeft: function(elem) { return parseInt(VMM.Lib.css(elem, 'left').substring(0, VMM.Lib.css(elem, 'left').length - 2), 10); }, getTop: function(elem) { return parseInt(VMM.Lib.css(elem, 'top').substring(0, VMM.Lib.css(elem, 'top').length - 2), 10); }, touchStart: function(elem, e) { VMM.Lib.css(elem, '-webkit-transition-duration', '0'); VMM.TouchSlider.startX = e.originalEvent.touches[0].screenX; VMM.TouchSlider.startY = e.originalEvent.touches[0].screenY; VMM.TouchSlider.startLeft = VMM.TouchSlider.getLeft(elem); VMM.TouchSlider.startTop = VMM.TouchSlider.getTop(elem); VMM.TouchSlider.touchStartTime = new Date().getTime(); }, touchEnd: function(elem, e) { if (VMM.TouchSlider.getLeft(elem) > 0) { //This means they dragged to the right past the first item if (VMM.TouchSlider.vertical) { VMM.Lib.animate(elem, 1000, "", {"top": 0}); } else { VMM.Lib.animate(elem, 1000, "", {"left": 0}); } VMM.TouchSlider.startX = null; VMM.TouchSlider.startY = null; VMM.fireEvent(elem, "TOUCHUPDATE", [0]); } else { //This means they were just dragging within the bounds of the grid and we just need to handle the momentum and snap to the grid. VMM.TouchSlider.slideMomentum(elem, e); } }, slideMomentum: function(elem, e) { var slideAdjust = (new Date().getTime() - VMM.TouchSlider.touchStartTime) * 10; var timeAdjust = slideAdjust; var left = VMM.TouchSlider.getLeft(elem); var top = VMM.TouchSlider.getTop(elem); var changeX = 6000 * (Math.abs(VMM.TouchSlider.startLeft) - Math.abs(left)); var changeY = 6000 * (Math.abs(VMM.TouchSlider.startTop) - Math.abs(top)); slideAdjust = Math.round(changeX / slideAdjust); slideAdjustY = Math.round(changeY / slideAdjust); var newLeft = slideAdjust + left; var newTop = slideAdjustY + top; var y = newTop % VMM.TouchSlider.height; var t = newLeft % VMM.TouchSlider.width; var _r_object = { top: Math.min(0, newTop), left: Math.min(0, newLeft), time: timeAdjust } VMM.fireEvent(elem, "TOUCHUPDATE", [_r_object]); /* if (VMM.TouchSlider.sticky) { trace("sticky"); if ((Math.abs(t)) > ((VMM.TouchSlider.width / 2))) { //Show the next cell newLeft -= (VMM.TouchSlider.width - Math.abs(t)); } else { //Stay on the current cell newLeft -= t; } VMM.fireEvent(elem, "TOUCHUPDATE", [Math.min(0, newLeft)]); } else { trace("not sticky"); //VMM.TouchSlider.doSlide(elem, Math.min(0, newLeft), '0.5s'); VMM.Lib.animate(elem, 500, "", {"left": Math.min(0, newLeft)}); } */ VMM.TouchSlider.startX = null; VMM.TouchSlider.startY = null; }, doSlide: function(elem, x, duration) { VMM.Lib.css(elem, '-webkit-transition-property', 'left'); VMM.Lib.css(elem, '-webkit-transition-duration', duration); VMM.Lib.css(elem, 'left', x); }, touchMove: function(elem, e) { if (!VMM.TouchSlider.sliding) { //elem.parent().addClass('sliding'); } VMM.TouchSlider.sliding = true; if (VMM.TouchSlider.vertical) { if (VMM.TouchSlider.startY > e.originalEvent.touches[0].screenY) { VMM.Lib.css(elem, 'top', -(VMM.TouchSlider.startY - e.originalEvent.touches[0].screenY - VMM.TouchSlider.startTop)); VMM.TouchSlider.slidingTop = true; } else { var top = (e.originalEvent.touches[0].screenY - VMM.TouchSlider.startY + VMM.TouchSlider.startTop); VMM.Lib.css(elem, 'top', -(VMM.TouchSlider.startY - e.originalEvent.touches[0].screenY - VMM.TouchSlider.startTop)); VMM.TouchSlider.slidingTop = false; } } else { if (VMM.TouchSlider.startX > e.originalEvent.touches[0].screenX) { VMM.Lib.css(elem, 'left', -(VMM.TouchSlider.startX - e.originalEvent.touches[0].screenX - VMM.TouchSlider.startLeft)); VMM.TouchSlider.slidingLeft = true; } else { var left = (e.originalEvent.touches[0].screenX - VMM.TouchSlider.startX + VMM.TouchSlider.startLeft); VMM.Lib.css(elem, 'left', -(VMM.TouchSlider.startX - e.originalEvent.touches[0].screenX - VMM.TouchSlider.startLeft)); VMM.TouchSlider.slidingLeft = false; } } } } } /*********************************************** Begin VMM.DragSlider.js ***********************************************/ /* DRAG SLIDER ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.DragSlider == 'undefined') { // VMM.DragSlider.createSlidePanel(drag_object, move_object, w, padding, sticky); // VMM.DragSlider.cancelSlide(); VMM.DragSlider = { createPanel: function(drag_object, move_object, w, padding, sticky) { var x = padding; VMM.DragSlider.width = w; VMM.DragSlider.makeDraggable(drag_object, move_object); VMM.DragSlider.drag_elem = drag_object; /* if (sticky != null && sticky != "") { VMM.TouchSlider.sticky = sticky; } else { VMM.TouchSlider.sticky = false; } */ VMM.DragSlider.sticky = sticky; }, makeDraggable: function(drag_object, move_object) { VMM.bindEvent(drag_object, VMM.DragSlider.onDragStart, "mousedown", {element: move_object, delement: drag_object}); //VMM.bindEvent(drag_object, VMM.DragSlider.onDragMove, "mousemove", {element: move_object}); VMM.bindEvent(drag_object, VMM.DragSlider.onDragEnd, "mouseup", {element: move_object, delement: drag_object}); VMM.bindEvent(drag_object, VMM.DragSlider.onDragLeave, "mouseleave", {element: move_object, delement: drag_object}); }, cancelSlide: function(e) { VMM.unbindEvent(VMM.DragSlider.drag_elem, VMM.DragSlider.onDragMove, "mousemove"); //VMM.DragSlider.drag_elem.preventDefault(); //VMM.DragSlider.drag_elem.stopPropagation(); return true; }, onDragLeave: function(e) { VMM.unbindEvent(e.data.delement, VMM.DragSlider.onDragMove, "mousemove"); e.preventDefault(); e.stopPropagation(); return true; }, onDragStart: function(e) { VMM.DragSlider.dragStart(e.data.element, e.data.delement, e); e.preventDefault(); e.stopPropagation(); return true; }, onDragEnd: function(e) { e.preventDefault(); e.stopPropagation(); if (VMM.DragSlider.sliding) { VMM.DragSlider.sliding = false; VMM.DragSlider.dragEnd(e.data.element, e.data.delement, e); return false; } else { return true; } }, onDragMove: function(e) { VMM.DragSlider.dragMove(e.data.element, e); e.preventDefault(); e.stopPropagation(); return false; }, dragStart: function(elem, delem, e) { VMM.DragSlider.startX = e.pageX; VMM.DragSlider.startLeft = VMM.DragSlider.getLeft(elem); VMM.DragSlider.dragStartTime = new Date().getTime(); VMM.DragSlider.dragWidth = VMM.Lib.width(delem); // CANCEL CURRENT ANIMATION IF ANIMATING var _newx = Math.round(VMM.DragSlider.startX - e.pageX - VMM.DragSlider.startLeft); VMM.Lib.stop(elem); VMM.bindEvent(delem, VMM.DragSlider.onDragMove, "mousemove", {element: elem}); }, dragEnd: function(elem, delem, e) { VMM.unbindEvent(delem, VMM.DragSlider.onDragMove, "mousemove"); //VMM.DragSlider.dragMomentum(elem, e); if (VMM.DragSlider.getLeft(elem) > 0) { //(VMM.DragSlider.dragWidth/2) //This means they dragged to the right past the first item //VMM.Lib.animate(elem, 1000, "linear", {"left": 0}); //VMM.fireEvent(elem, "DRAGUPDATE", [0]); } else { //This means they were just dragging within the bounds of the grid and we just need to handle the momentum and snap to the grid. VMM.DragSlider.dragMomentum(elem, e); } }, dragMove: function(elem, e) { if (!VMM.DragSlider.sliding) { //elem.parent().addClass('sliding'); } VMM.DragSlider.sliding = true; if (VMM.DragSlider.startX > e.pageX) { //Sliding to the left VMM.Lib.css(elem, 'left', -(VMM.DragSlider.startX - e.pageX - VMM.DragSlider.startLeft)); VMM.DragSlider.slidingLeft = true; } else { //Sliding to the right var left = (e.pageX - VMM.DragSlider.startX + VMM.DragSlider.startLeft); VMM.Lib.css(elem, 'left', -(VMM.DragSlider.startX - e.pageX - VMM.DragSlider.startLeft)); VMM.DragSlider.slidingLeft = false; } }, dragMomentum: function(elem, e) { var slideAdjust = (new Date().getTime() - VMM.DragSlider.dragStartTime) * 10; var timeAdjust = slideAdjust; var left = VMM.DragSlider.getLeft(elem); var changeX = 6000 * (Math.abs(VMM.DragSlider.startLeft) - Math.abs(left)); //var changeX = 6000 * (VMM.DragSlider.startLeft - left); slideAdjust = Math.round(changeX / slideAdjust); var newLeft = left + slideAdjust; var t = newLeft % VMM.DragSlider.width; //left: Math.min(0, newLeft), var _r_object = { left: Math.min(newLeft), time: timeAdjust } VMM.fireEvent(elem, "DRAGUPDATE", [_r_object]); var _ease = "easeOutExpo"; if (_r_object.time > 0) { VMM.Lib.animate(elem, _r_object.time, _ease, {"left": _r_object.left}); }; //VMM.DragSlider.startX = null; }, getLeft: function(elem) { return parseInt(VMM.Lib.css(elem, 'left').substring(0, VMM.Lib.css(elem, 'left').length - 2), 10); } } } /*********************************************** Begin VMM.Slider.js ***********************************************/ /* Slider ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Slider == 'undefined') { VMM.Slider = function(parent, parent_config) { var events = {}, config; var $slider, $slider_mask, $slider_container, $slides_items; var data = [], slides = [], slide_positions = []; var slides_content = ""; var current_slide = 0; var current_width = 960; var touch = {move: false, x: 10, y:0, off: 0, dampen: 48}; var content = ""; var _active = false; var layout = parent; var navigation = {nextBtn:"", prevBtn:"", nextDate:"", prevDate:"", nextTitle:"", prevTitle:""}; var timer; // CONFIG if(typeof VMM.Timeline != 'undefined') { config = VMM.Timeline.Config; } else { config = { preload: 4, current_slide: 0, interval: 10, something: 0, width: 720, height: 400, ease: "easeInOutExpo", duration: 1000, timeline: false, spacing: 15, slider: { width: 720, height: 400, content: { width: 720, height: 400, padding: 130 }, nav: { width: 100, height: 200 } } }; } /* PUBLIC VARS ================================================== */ this.ver = "0.6"; config.slider.width = config.width; config.slider.height = config.height; /* PUBLIC FUNCTIONS ================================================== */ this.init = function(d) { slides = []; slide_positions = []; if(typeof d != 'undefined') { this.setData(d); } else { trace("WAITING ON DATA"); } }; this.width = function(w) { if (w != null && w != "") { config.slider.width = w; reSize(); } else { return config.slider.width; } } this.height = function(h) { if (h != null && h != "") { config.slider.height = h; reSize(); } else { return config.slider.height; } } /* GETTERS AND SETTERS ================================================== */ this.setData = function(d) { if(typeof d != 'undefined') { data = d; build(); } else{ trace("NO DATA"); } }; this.getData = function() { return data; }; this.setConfig = function(d) { if(typeof d != 'undefined') { config = d; } else{ trace("NO CONFIG DATA"); } } this.getConfig = function() { return config; }; this.setSize = function(w, h) { if (w != null) {config.slider.width = w}; if (h != null) {config.slider.height = h}; if (_active) { reSize(); } } this.active = function() { return _active; }; this.getCurrentNumber = function() { return current_slide; }; this.setSlide = function(n) { goToSlide(n); }; /* ON EVENT ================================================== */ function onConfigSet() { trace("onConfigSet"); }; function reSize(go_to_slide, from_start) { var _go_to_slide = true; var _from_start = false; if (go_to_slide != null) {_go_to_slide = go_to_slide}; if (from_start != null) {_from_start = from_start}; current_width = config.slider.width; config.slider.nav.height = VMM.Lib.height(navigation.prevBtnContainer); config.slider.content.width = current_width - (config.slider.content.padding *2); VMM.Lib.width($slides_items, (slides.length * config.slider.content.width)); if (_from_start) { var _pos = slides[current_slide].leftpos(); VMM.Lib.css($slider_container, "left", _pos); } // RESIZE SLIDES sizeSlides(); // POSITION SLIDES positionSlides(); // POSITION NAV VMM.Lib.css(navigation.nextBtn, "left", (current_width - config.slider.nav.width)); VMM.Lib.height(navigation.prevBtn, config.slider.height); VMM.Lib.height(navigation.nextBtn, config.slider.height); VMM.Lib.css(navigation.nextBtnContainer, "top", ( (config.slider.height/2) - (config.slider.nav.height/2) ) + 10 ); VMM.Lib.css(navigation.prevBtnContainer, "top", ( (config.slider.height/2) - (config.slider.nav.height/2) ) + 10 ); // Animate Changes VMM.Lib.height($slider_mask, config.slider.height); VMM.Lib.width($slider_mask, current_width); if (_go_to_slide) { goToSlide(current_slide, "linear", 1); }; if (current_slide == 0) { VMM.Lib.visible(navigation.prevBtn, false); } } /* NAVIGATION ================================================== */ function onNextClick(e) { if (current_slide == slides.length - 1) { VMM.Lib.animate($slider_container, config.duration, config.ease, {"left": -(slides[current_slide].leftpos()) } ); } else { goToSlide(current_slide+1); upDate(); } } function onPrevClick(e) { if (current_slide == 0) { goToSlide(current_slide); } else { goToSlide(current_slide-1); upDate(); } } function onKeypressNav(e) { switch(e.keyCode) { case 39: // RIGHT ARROW onNextClick(e); break; case 37: // LEFT ARROW onPrevClick(e); break; } } function onTouchUpdate(e, b) { if (slide_positions.length == 0) { for(var i = 0; i < slides.length; i++) { slide_positions.push( slides[i].leftpos() ); } } if (typeof b.left == "number") { var _pos = b.left; var _slide_pos = -(slides[current_slide].leftpos()); if (_pos < _slide_pos - (config.slider_width/3)) { onNextClick(); } else if (_pos > _slide_pos + (config.slider_width/3)) { onPrevClick(); } else { VMM.Lib.animate($slider_container, config.duration, config.ease, {"left": _slide_pos }); } } else { VMM.Lib.animate($slider_container, config.duration, config.ease, {"left": _slide_pos }); } if (typeof b.top == "number") { VMM.Lib.animate($slider_container, config.duration, config.ease, {"top": -b.top}); } else { } }; /* UPDATE ================================================== */ function upDate() { config.current_slide = current_slide; VMM.fireEvent(layout, "UPDATE"); }; /* GET DATA ================================================== */ var getData = function(d) { data = d; }; /* BUILD SLIDES ================================================== */ var buildSlides = function(d) { VMM.attachElement($slides_items, ""); slides = []; for(var i = 0; i < d.length; i++) { var _slide = new VMM.Slider.Slide(d[i], $slides_items); //_slide.show(); slides.push(_slide); } } var preloadSlides = function(skip) { if (skip) { preloadTimeOutSlides(); } else { for(var k = 0; k < slides.length; k++) { slides[k].clearTimers(); } timer = setTimeout(preloadTimeOutSlides, config.duration); } } var preloadTimeOutSlides = function() { for(var k = 0; k < slides.length; k++) { slides[k].enqueue = true; } for(var j = 0; j < config.preload; j++) { if ( !((current_slide + j) > slides.length - 1)) { slides[current_slide + j].show(); slides[current_slide + j].enqueue = false; } if ( !( (current_slide - j) < 0 ) ) { slides[current_slide - j].show(); slides[current_slide - j].enqueue = false; } } if (slides.length > 50) { for(var i = 0; i < slides.length; i++) { if (slides[i].enqueue) { slides[i].hide(); } } } sizeSlides(); } var sizeSlide = function(slide_id) { } /* SIZE SLIDES ================================================== */ var sizeSlides = function() { var layout_text_media = ".slider-item .layout-text-media .media .media-container "; var layout_media = ".slider-item .layout-media .media .media-container "; var layout_both = ".slider-item .media .media-container"; var mediasize = { text_media: { width: (config.slider.content.width/100) * 60, height: config.slider.height - 60, video: { width: 0, height: 0 }, text: { width: ((config.slider.content.width/100) * 40) - 30, height: config.slider.height } }, media: { width: config.slider.content.width, height: config.slider.height - 110, video: { width: 0, height: 0 } } } VMM.master_config.sizes.api.width = mediasize.media.width; VMM.master_config.sizes.api.height = mediasize.media.height; mediasize.text_media.video = VMM.Util.ratio.fit(mediasize.text_media.width, mediasize.text_media.height, 16, 9); mediasize.media.video = VMM.Util.ratio.fit(mediasize.media.width, mediasize.media.height, 16, 9); VMM.Lib.css(".slider-item", "width", config.slider.content.width ); VMM.Lib.height(".slider-item", config.slider.height); // HANDLE SMALLER SIZES var is_skinny = false; if (current_width <= 640) { is_skinny = true; } else if (VMM.Browser.device == "mobile" && VMM.Browser.orientation == "portrait") { is_skinny = true; } else if (VMM.Browser.device == "tablet" && VMM.Browser.orientation == "portrait") { //is_skinny = true; } if (is_skinny) { mediasize.text_media.width = config.slider.content.width; mediasize.text_media.height = ((config.slider.height/100) * 50 ) - 50; mediasize.media.height = ((config.slider.height/100) * 70 ) - 40; mediasize.text_media.video = VMM.Util.ratio.fit(mediasize.text_media.width, mediasize.text_media.height, 16, 9); mediasize.media.video = VMM.Util.ratio.fit(mediasize.media.width, mediasize.media.height, 16, 9); VMM.Lib.css(".slider-item .layout-text-media .text", "width", "100%" ); VMM.Lib.css(".slider-item .layout-text-media .text", "display", "block" ); VMM.Lib.css(".slider-item .layout-text-media .text .container", "display", "block" ); VMM.Lib.css(".slider-item .layout-text-media .text .container", "width", config.slider.content.width ); VMM.Lib.css(".slider-item .layout-text-media .media", "float", "none" ); VMM.Lib.addClass(".slider-item .content-container", "pad-top"); VMM.Lib.css(".slider-item .media blockquote p", "line-height", "18px" ); VMM.Lib.css(".slider-item .media blockquote p", "font-size", "16px" ); VMM.Lib.css(".slider-item", "overflow-y", "auto" ); } else { VMM.Lib.css(".slider-item .layout-text-media .text", "width", "40%" ); VMM.Lib.css(".slider-item .layout-text-media .text", "display", "table-cell" ); VMM.Lib.css(".slider-item .layout-text-media .text .container", "display", "table-cell" ); VMM.Lib.css(".slider-item .layout-text-media .text .container", "width", "auto" ); VMM.Lib.css(".slider-item .layout-text-media .text .container .start", "width", mediasize.text_media.text.width ); //VMM.Lib.addClass(".slider-item .content-container", "pad-left"); VMM.Lib.removeClass(".slider-item .content-container", "pad-top"); VMM.Lib.css(".slider-item .layout-text-media .media", "float", "left" ); VMM.Lib.css(".slider-item .layout-text-media", "display", "table" ); VMM.Lib.css(".slider-item .media blockquote p", "line-height", "36px" ); VMM.Lib.css(".slider-item .media blockquote p", "font-size", "28px" ); VMM.Lib.css(".slider-item", "display", "table" ); VMM.Lib.css(".slider-item", "overflow-y", "auto" ); } // MEDIA FRAME VMM.Lib.css( layout_text_media + ".media-frame", "max-width", mediasize.text_media.width); VMM.Lib.height( layout_text_media + ".media-frame", mediasize.text_media.height); VMM.Lib.width( layout_text_media + ".media-frame", mediasize.text_media.width); // WEBSITES //VMM.Lib.css( layout_both + ".website", "max-width", 300 ); // IMAGES VMM.Lib.css( layout_text_media + "img", "max-height", mediasize.text_media.height ); VMM.Lib.css( layout_media + "img", "max-height", mediasize.media.height ); // FIX FOR NON-WEBKIT BROWSERS VMM.Lib.css( layout_text_media + "img", "max-width", mediasize.text_media.width ); VMM.Lib.css( layout_text_media + ".avatar img", "max-width", 32 ); VMM.Lib.css( layout_text_media + ".avatar img", "max-height", 32 ); VMM.Lib.css( layout_media + ".avatar img", "max-width", 32 ); VMM.Lib.css( layout_media + ".avatar img", "max-height", 32 ); VMM.Lib.css( layout_text_media + ".article-thumb", "max-width", "50%" ); //VMM.Lib.css( layout_text_media + ".article-thumb", "max-height", 100 ); VMM.Lib.css( layout_media + ".article-thumb", "max-width", 200 ); //VMM.Lib.css( layout_media + ".article-thumb", "max-height", 100 ); // IFRAME FULL SIZE VIDEO VMM.Lib.width( layout_text_media + ".media-frame", mediasize.text_media.video.width); VMM.Lib.height( layout_text_media + ".media-frame", mediasize.text_media.video.height); VMM.Lib.width( layout_media + ".media-frame", mediasize.media.video.width); VMM.Lib.height( layout_media + ".media-frame", mediasize.media.video.height); VMM.Lib.css( layout_media + ".media-frame", "max-height", mediasize.media.video.height); VMM.Lib.css( layout_media + ".media-frame", "max-width", mediasize.media.video.width); // SOUNDCLOUD VMM.Lib.height( layout_media + ".soundcloud", 168); VMM.Lib.height( layout_text_media + ".soundcloud", 168); VMM.Lib.width( layout_media + ".soundcloud", mediasize.media.width); VMM.Lib.width( layout_text_media + ".soundcloud", mediasize.text_media.width); VMM.Lib.css( layout_both + ".soundcloud", "max-height", 168 ); // MAPS VMM.Lib.height( layout_text_media + ".map", mediasize.text_media.height); VMM.Lib.css( layout_media + ".map", "max-height", mediasize.media.height); VMM.Lib.width( layout_media + ".map", mediasize.media.width); // DOCS VMM.Lib.height( layout_text_media + ".doc", mediasize.text_media.height); VMM.Lib.height( layout_media + ".doc", mediasize.media.height); // IE8 NEEDS THIS VMM.Lib.width( layout_media + ".wikipedia", mediasize.media.width); VMM.Lib.width( layout_media + ".twitter", mediasize.media.width); VMM.Lib.width( layout_media + ".plain-text-quote", mediasize.media.width); VMM.Lib.width( layout_media + ".plain-text", mediasize.media.width); // MAINTAINS VERTICAL CENTER IF IT CAN for(var i = 0; i < slides.length; i++) { slides[i].layout(is_skinny); if (slides[i].content_height() > config.slider.height + 20) { slides[i].css("display", "block"); } else { slides[i].css("display", "table"); } } } /* POSITION SLIDES ================================================== */ var positionSlides = function() { var pos = 0; for(var i = 0; i < slides.length; i++) { pos = i * (config.slider.width+config.spacing); slides[i].leftpos(pos); } } /* OPACITY SLIDES ================================================== */ var opacitySlides = function(n) { var _ease = "linear"; for(var i = 0; i < slides.length; i++) { if (i == current_slide) { slides[i].animate(config.duration, _ease, {"opacity": 1}); } else if (i == current_slide - 1 || i == current_slide + 1) { slides[i].animate(config.duration, _ease, {"opacity": 0.1}); } else { slides[i].opacity(n); } } } /* GO TO SLIDE goToSlide(n, ease, duration); ================================================== */ var goToSlide = function(n, ease, duration, fast, firstrun) { /* STOP ANY VIDEO PLAYERS ACTIVE ================================================== */ VMM.ExternalAPI.youtube.stopPlayers(); // Set current slide current_slide = n; var _ease = config.ease; var _duration = config.duration; var is_last = false; var is_first = false; var _pos = slides[current_slide].leftpos(); var _title = ""; if (current_slide == 0) {is_first = true}; if (current_slide +1 >= slides.length) {is_last = true}; if (ease != null && ease != "") {_ease = ease}; if (duration != null && duration != "") {_duration = duration}; /* set proper nav titles and dates etc. ================================================== */ if (is_first) { VMM.Lib.visible(navigation.prevBtn, false); } else { VMM.Lib.visible(navigation.prevBtn, true); _title = VMM.Util.unlinkify(data[current_slide - 1].title) if (config.type == "timeline") { if(typeof data[current_slide - 1].date === "undefined") { VMM.attachElement(navigation.prevDate, _title); VMM.attachElement(navigation.prevTitle, ""); } else { VMM.attachElement(navigation.prevDate, VMM.Date.prettyDate(data[current_slide - 1].startdate)); VMM.attachElement(navigation.prevTitle, _title); } } else { VMM.attachElement(navigation.prevTitle, _title); } } if (is_last) { VMM.Lib.visible(navigation.nextBtn, false); } else { VMM.Lib.visible(navigation.nextBtn, true); _title = VMM.Util.unlinkify(data[current_slide + 1].title); if (config.type == "timeline") { if(typeof data[current_slide + 1].date === "undefined") { VMM.attachElement(navigation.nextDate, _title); VMM.attachElement(navigation.nextTitle, ""); } else { VMM.attachElement(navigation.nextDate, VMM.Date.prettyDate(data[current_slide + 1].startdate) ); VMM.attachElement(navigation.nextTitle, _title); } } else { VMM.attachElement(navigation.nextTitle, _title); } } /* ANIMATE SLIDE ================================================== */ if (fast) { VMM.Lib.css($slider_container, "left", -(_pos - config.slider.content.padding)); } else{ VMM.Lib.stop($slider_container); VMM.Lib.animate($slider_container, _duration, _ease, {"left": -(_pos - config.slider.content.padding)}); } if (firstrun) { VMM.fireEvent(layout, "LOADED"); } /* SET Vertical Scoll ================================================== */ if (slides[current_slide].height() > config.slider_height) { VMM.Lib.css(".slider", "overflow-y", "scroll" ); } else { VMM.Lib.css(layout, "overflow-y", "hidden" ); VMM.Lib.animate(layout, _duration, _ease, {scrollTop: VMM.Lib.prop(layout, "scrollHeight") - VMM.Lib.height(layout) }); } preloadSlides(); } /* BUILD NAVIGATION ================================================== */ var buildNavigation = function() { var temp_icon = "
 
"; navigation.nextBtn = VMM.appendAndGetElement($slider, "
", "nav-next"); navigation.prevBtn = VMM.appendAndGetElement($slider, "
", "nav-previous"); navigation.nextBtnContainer = VMM.appendAndGetElement(navigation.nextBtn, "
", "nav-container", temp_icon); navigation.prevBtnContainer = VMM.appendAndGetElement(navigation.prevBtn, "
", "nav-container", temp_icon); if (config.type == "timeline") { navigation.nextDate = VMM.appendAndGetElement(navigation.nextBtnContainer, "
", "date", ""); navigation.prevDate = VMM.appendAndGetElement(navigation.prevBtnContainer, "
", "date", ""); } navigation.nextTitle = VMM.appendAndGetElement(navigation.nextBtnContainer, "
", "title", "Title Goes Here"); navigation.prevTitle = VMM.appendAndGetElement(navigation.prevBtnContainer, "
", "title", "Title Goes Here"); VMM.bindEvent(".nav-next", onNextClick); VMM.bindEvent(".nav-previous", onPrevClick); VMM.bindEvent(window, onKeypressNav, 'keydown'); } /* BUILD ================================================== */ var build = function() { // Clear out existing content VMM.attachElement(layout, ""); // Get DOM Objects to local objects $slider = VMM.getElement("div.slider"); $slider_mask = VMM.appendAndGetElement($slider, "
", "slider-container-mask"); $slider_container = VMM.appendAndGetElement($slider_mask, "
", "slider-container"); $slides_items = VMM.appendAndGetElement($slider_container, "
", "slider-item-container"); // BUILD NAVIGATION buildNavigation(); // ATTACH SLIDES buildSlides(data); /* MAKE SLIDER TOUCHABLE ================================================== */ var __duration = 3000; if (VMM.Browser.device == "tablet" || VMM.Browser.device == "mobile") { config.duration = 500; __duration = 1000; //VMM.TouchSlider.createPanel($slider_container, $slider_container, VMM.Lib.width(slides[0]), config.spacing, true); //VMM.TouchSlider.createPanel($slider_container, $slider_container, slides[0].width(), config.spacing, true); //VMM.bindEvent($slider_container, onTouchUpdate, "TOUCHUPDATE"); } else if (VMM.Browser.device == "mobile") { } else { //VMM.DragSlider.createPanel($slider_container, $slider_container, VMM.Lib.width(slides[0]), config.spacing, true); } reSize(false, true); VMM.Lib.visible(navigation.prevBtn, false); goToSlide(config.current_slide, "easeOutExpo", __duration, true, true); _active = true; }; }; } /*********************************************** Begin VMM.Slider.Slide.js ***********************************************/ /* Slider Slide ================================================== */ if (typeof VMM.Slider != 'undefined') { VMM.Slider.Slide = function(d, _parent) { var $media, $text, $slide, $wrap, element, c, data = d, slide = {}, element = "", media = "", loaded = false, preloaded = false, is_skinny = false, _enqueue = true, _removeque = false, _id = "slide_", timer = {pushque:"", render:"", relayout:"", remove:"", skinny:false}, times = {pushque:500, render:100, relayout:100, remove:30000}; _id = _id + data.uniqueid; this.enqueue = _enqueue; this.id = _id; element = VMM.appendAndGetElement(_parent, "
", "slider-item"); c = {slide:"", text: "", media: "", media_element: "", layout: "content-container layout", has: { headline: false, text: false, media: false }}; /* PUBLIC ================================================== */ this.show = function(skinny) { _enqueue = false; timer.skinny = skinny; _removeque = false; clearTimeout(timer.remove); if (!loaded) { if (preloaded) { clearTimeout(timer.relayout); timer.relayout = setTimeout(reloadLayout, times.relayout); } else { render(skinny); } } }; this.hide = function() { if (loaded && !_removeque) { _removeque = true; clearTimeout(timer.remove); timer.remove = setTimeout(removeSlide, times.remove); } }; this.clearTimers = function() { //clearTimeout(timer.remove); clearTimeout(timer.relayout); clearTimeout(timer.pushque); clearTimeout(timer.render); }; this.layout = function(skinny) { if (loaded && preloaded) { reLayout(skinny); } }; this.elem = function() { return element; }; this.position = function() { return VMM.Lib.position(element); }; this.leftpos = function(p) { if(typeof p != 'undefined') { VMM.Lib.css(element, "left", p); } else { return VMM.Lib.position(element).left } }; this.animate = function(d, e, p) { VMM.Lib.animate(element, d, e, p); }; this.css = function(p, v) { VMM.Lib.css(element, p, v ); } this.opacity = function(p) { VMM.Lib.css(element, "opacity", p); } this.width = function() { return VMM.Lib.width(element); }; this.height = function() { return VMM.Lib.height(element); }; this.content_height = function () { var ch = VMM.Lib.find( element, ".content")[0]; if (ch != 'undefined' && ch != null) { return VMM.Lib.height(ch); } else { return 0; } } /* PRIVATE ================================================== */ var render = function(skinny) { trace("RENDER " + _id); loaded = true; preloaded = true; timer.skinny = skinny; buildSlide(); clearTimeout(timer.pushque); clearTimeout(timer.render); timer.pushque = setTimeout(VMM.ExternalAPI.pushQues, times.pushque); }; var removeSlide = function() { //VMM.attachElement(element, ""); trace("REMOVE SLIDE TIMER FINISHED"); loaded = false; VMM.Lib.detach($text); VMM.Lib.detach($media); }; var reloadLayout = function() { loaded = true; reLayout(timer.skinny, true); }; var reLayout = function(skinny, reload) { if (c.has.text) { if (skinny) { if (!is_skinny || reload) { VMM.Lib.removeClass($slide, "pad-left"); VMM.Lib.detach($text); VMM.Lib.detach($media); VMM.Lib.append($slide, $text); VMM.Lib.append($slide, $media); is_skinny = true; } } else { if (is_skinny || reload) { VMM.Lib.addClass($slide, "pad-left"); VMM.Lib.detach($text); VMM.Lib.detach($media); VMM.Lib.append($slide, $media); VMM.Lib.append($slide, $text); is_skinny = false; } } } else if (reload) { if (c.has.headline) { VMM.Lib.detach($text); VMM.Lib.append($slide, $text); } VMM.Lib.detach($media); VMM.Lib.append($slide, $media); } } var buildSlide = function() { trace("BUILDSLIDE"); $wrap = VMM.appendAndGetElement(element, "
", "content"); $slide = VMM.appendAndGetElement($wrap, "
"); /* DATE ================================================== */ if (data.startdate != null && data.startdate != "") { if (type.of(data.startdate) == "date") { if (data.type != "start") { var st = VMM.Date.prettyDate(data.startdate); var en = VMM.Date.prettyDate(data.enddate); if (st != en) { c.text += VMM.createElement("h2", st + " — " + en + "", "date"); } else { c.text += VMM.createElement("h2", st, "date"); } } } } /* HEADLINE ================================================== */ if (data.headline != null && data.headline != "") { c.has.headline = true; if (data.type == "start") { c.text += VMM.createElement("h2", VMM.Util.linkify_with_twitter(data.headline, "_blank"), "start"); } else { c.text += VMM.createElement("h3", VMM.Util.linkify_with_twitter(data.headline, "_blank")); } } /* TEXT ================================================== */ if (data.text != null && data.text != "") { c.has.text = true; c.text += VMM.createElement("p", VMM.Util.linkify_with_twitter(data.text, "_blank")); } if (c.has.text || c.has.headline) { c.text = VMM.createElement("div", c.text, "container"); //$text = VMM.appendAndGetElement($slide, "
", "text", c.text); $text = VMM.appendAndGetElement($slide, "
", "text", VMM.TextElement.create(c.text)); } /* SLUG ================================================== */ if (data.needs_slug) { } /* MEDIA ================================================== */ 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)); } } /* COMBINE ================================================== */ if (c.has.text) { c.layout += "-text" }; if (c.has.media){ c.layout += "-media" }; if (c.has.text) { if (timer.skinny) { VMM.Lib.addClass($slide, c.layout); is_skinny = true; } else { VMM.Lib.addClass($slide, c.layout); VMM.Lib.addClass($slide, "pad-left"); VMM.Lib.detach($text); VMM.Lib.append($slide, $text); } } else { VMM.Lib.addClass($slide, c.layout); } }; } }; /*********************************************** Begin VMM.Language.js ***********************************************/ /* DEFAULT LANGUAGE ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Language == 'undefined') { VMM.Language = { lang: "en", api: { wikipedia: "en" }, date: { month: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], month_abbr: ["Jan.", "Feb.", "March", "April", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."], day: ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], day_abbr: ["Sun.","Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat."], }, dateformats: { year: "yyyy", month_short: "mmm", month: "mmmm yyyy", full_short: "mmm d", full: "mmmm d',' yyyy", time_no_seconds_short: "h:MM TT", time_no_seconds_small_date: "h:MM TT'
'mmmm d',' yyyy''", full_long: "mmm d',' yyyy 'at' hh:MM TT", full_long_small_date: "hh:MM TT'
mmm d',' yyyy''", }, messages: { loading_timeline: "Loading Timeline... ", return_to_title: "Return to Title", expand_timeline: "Expand Timeline", contract_timeline: "Contract Timeline", wikipedia: "From Wikipedia, the free encyclopedia", loading_content: "Loading Content", loading: "Loading" } } }; /*********************************************** Begin AES.js ***********************************************/ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* AES implementation in JavaScript (c) Chris Veness 2005-2011 */ /* - see http://csrc.nist.gov/publications/PubsFIPS.html#197 */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var Aes = {}; // Aes namespace /** * AES Cipher function: encrypt 'input' state with Rijndael algorithm * applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage * * @param {Number[]} input 16-byte (128-bit) input state array * @param {Number[][]} w Key schedule as 2D byte-array (Nr+1 x Nb bytes) * @returns {Number[]} Encrypted output state array */ Aes.cipher = function(input, w) { // main Cipher function [§5.1] var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES) var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys var state = [[],[],[],[]]; // initialise 4xNb byte-array 'state' with input [§3.4] for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i]; state = Aes.addRoundKey(state, w, 0, Nb); for (var round=1; round 6 && i%Nk == 4) { temp = Aes.subWord(temp); } for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t]; } return w; } /* * ---- remaining routines are private, not called externally ---- */ Aes.subBytes = function(s, Nb) { // apply SBox to state S [§5.1.1] for (var r=0; r<4; r++) { for (var c=0; c>> i*8) & 0xff; for (var i=0; i<2; i++) counterBlock[i+2] = (nonceRnd >>> i*8) & 0xff; for (var i=0; i<4; i++) counterBlock[i+4] = (nonceSec >>> i*8) & 0xff; // and convert it to a string to go on the front of the ciphertext var ctrTxt = ''; for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]); // generate key schedule - an expansion of the key into distinct Key Rounds for each round var keySchedule = Aes.keyExpansion(key); var blockCount = Math.ceil(plaintext.length/blockSize); var ciphertxt = new Array(blockCount); // ciphertext as array of strings for (var b=0; b>> c*8) & 0xff; for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8) var cipherCntr = Aes.cipher(counterBlock, keySchedule); // -- encrypt counter block -- // block size is reduced on final block var blockLength = b>> c*8) & 0xff; for (var c=0; c<4; c++) counterBlock[15-c-4] = (((b+1)/0x100000000-1) >>> c*8) & 0xff; var cipherCntr = Aes.cipher(counterBlock, keySchedule); // encrypt counter block var plaintxtByte = new Array(ciphertext[b].length); for (var i=0; i 0) { while (c++ < 3) { pad += '='; plain += '\0'; } } // note: doing padding here saves us doing special-case packing for trailing 1 or 2 chars for (c=0; c>18 & 0x3f; h2 = bits>>12 & 0x3f; h3 = bits>>6 & 0x3f; h4 = bits & 0x3f; // use hextets to index into code string e[c/3] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); } coded = e.join(''); // join() is far faster than repeated string concatenation in IE // replace 'A's from padded nulls with '='s coded = coded.slice(0, coded.length-pad.length) + pad; return coded; } /** * Decode string from Base64, as defined by RFC 4648 [http://tools.ietf.org/html/rfc4648] * (instance method extending String object). As per RFC 4648, newlines are not catered for. * * @param {String} str The string to be decoded from base-64 * @param {Boolean} [utf8decode=false] Flag to indicate whether str is Unicode string to be decoded * from UTF8 after conversion from base64 * @returns {String} decoded string */ Base64.decode = function(str, utf8decode) { utf8decode = (typeof utf8decode == 'undefined') ? false : utf8decode; var o1, o2, o3, h1, h2, h3, h4, bits, d=[], plain, coded; var b64 = Base64.code; coded = utf8decode ? str.decodeUTF8() : str; for (var c=0; c>>16 & 0xff; o2 = bits>>>8 & 0xff; o3 = bits & 0xff; d[c/4] = String.fromCharCode(o1, o2, o3); // check for padding if (h4 == 0x40) d[c/4] = String.fromCharCode(o1, o2); if (h3 == 0x40) d[c/4] = String.fromCharCode(o1); } plain = d.join(''); // join() is far faster than repeated string concatenation in IE return utf8decode ? plain.decodeUTF8() : plain; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple */ /* single-byte character encoding (c) Chris Veness 2002-2011 */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var Utf8 = {}; // Utf8 namespace /** * Encode multi-byte Unicode string into utf-8 multiple single-byte characters * (BMP / basic multilingual plane only) * * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars * * @param {String} strUni Unicode string to be encoded as UTF-8 * @returns {String} encoded string */ Utf8.encode = function(strUni) { // use regular expressions & String.replace callback function for better efficiency // than procedural approaches var strUtf = strUni.replace( /[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz function(c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); } ); strUtf = strUtf.replace( /[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz function(c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); } ); return strUtf; } /** * Decode utf-8 encoded string back into multi-byte Unicode characters * * @param {String} strUtf UTF-8 string to be decoded back to Unicode * @returns {String} decoded string */ Utf8.decode = function(strUtf) { // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char! var strUni = strUtf.replace( /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars function(c) { // (note parentheses for precence) var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f); return String.fromCharCode(cc); } ); strUni = strUni.replace( /[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars function(c) { // (note parentheses for precence) var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f; return String.fromCharCode(cc); } ); return strUni; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /*********************************************** Begin bootstrap-tooltip.js ***********************************************/ /* =========================================================== * bootstrap-tooltip.js v2.0.1 * http://twitter.github.com/bootstrap/javascript.html#tooltips * Inspired by the original jQuery.tipsy by Jason Frame * =========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ) { "use strict" /* TOOLTIP PUBLIC CLASS DEFINITION * =============================== */ var Tooltip = function ( element, options ) { this.init('tooltip', element, options) } Tooltip.prototype = { constructor: Tooltip , init: function ( type, element, options ) { var eventIn , eventOut this.type = type this.$element = $(element) this.options = this.getOptions(options) this.enabled = true if (this.options.trigger != 'manual') { eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } , getOptions: function ( options ) { options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay , hide: options.delay } } return options } , enter: function ( e ) { var self = $(e.currentTarget)[this.type](this._options).data(this.type) if (!self.options.delay || !self.options.delay.show) { self.show() } else { self.hoverState = 'in' setTimeout(function() { if (self.hoverState == 'in') { self.show() } }, self.options.delay.show) } } , leave: function ( e ) { var self = $(e.currentTarget)[this.type](this._options).data(this.type) if (!self.options.delay || !self.options.delay.hide) { self.hide() } else { self.hoverState = 'out' setTimeout(function() { if (self.hoverState == 'out') { self.hide() } }, self.options.delay.hide) } } , show: function () { var $tip , inside , pos , actualWidth , actualHeight , placement , tp if (this.hasContent() && this.enabled) { $tip = this.tip() this.setContent() if (this.options.animation) { $tip.addClass('fade') } placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement inside = /in/.test(placement) $tip .remove() .css({ top: 0, left: 0, display: 'block' }) .appendTo(inside ? this.$element : document.body) pos = this.getPosition(inside) actualWidth = $tip[0].offsetWidth actualHeight = $tip[0].offsetHeight switch (inside ? placement.split(' ')[1] : placement) { case 'bottom': tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} break case 'top': tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} break case 'left': tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} break case 'right': tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} break } $tip .css(tp) .addClass(placement) .addClass('in') } } , setContent: function () { var $tip = this.tip() $tip.find('.tooltip-inner').html(this.getTitle()) $tip.removeClass('fade in top bottom left right') } , hide: function () { var that = this , $tip = this.tip() $tip.removeClass('in') function removeWithAnimation() { var timeout = setTimeout(function () { $tip.off($.support.transition.end).remove() }, 500) $tip.one($.support.transition.end, function () { clearTimeout(timeout) $tip.remove() }) } $.support.transition && this.$tip.hasClass('fade') ? removeWithAnimation() : $tip.remove() } , fixTitle: function () { var $e = this.$element if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') } } , hasContent: function () { return this.getTitle() } , getPosition: function (inside) { return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { width: this.$element[0].offsetWidth , height: this.$element[0].offsetHeight }) } , getTitle: function () { var title , $e = this.$element , o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) title = title.toString().replace(/(^\s*|\s*$)/, "") return title } , tip: function () { return this.$tip = this.$tip || $(this.options.template) } , validate: function () { if (!this.$element[0].parentNode) { this.hide() this.$element = null this.options = null } } , enable: function () { this.enabled = true } , disable: function () { this.enabled = false } , toggleEnabled: function () { this.enabled = !this.enabled } , toggle: function () { this[this.tip().hasClass('in') ? 'hide' : 'show']() } } /* TOOLTIP PLUGIN DEFINITION * ========================= */ $.fn.tooltip = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('tooltip') , options = typeof option == 'object' && option if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.tooltip.Constructor = Tooltip $.fn.tooltip.defaults = { animation: true , delay: 0 , selector: false , placement: 'top' , trigger: 'hover' , title: '' , template: '
' } }( window.jQuery ); /*********************************************** Begin bootstrap-tooltip.js ***********************************************/ /* =========================================================== * bootstrap-tooltip.js v2.0.1 * http://twitter.github.com/bootstrap/javascript.html#tooltips * Inspired by the original jQuery.tipsy by Jason Frame * =========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ) { "use strict" /* TOOLTIP PUBLIC CLASS DEFINITION * =============================== */ var Tooltip = function ( element, options ) { this.init('tooltip', element, options) } Tooltip.prototype = { constructor: Tooltip , init: function ( type, element, options ) { var eventIn , eventOut this.type = type this.$element = $(element) this.options = this.getOptions(options) this.enabled = true if (this.options.trigger != 'manual') { eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } , getOptions: function ( options ) { options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay , hide: options.delay } } return options } , enter: function ( e ) { var self = $(e.currentTarget)[this.type](this._options).data(this.type) if (!self.options.delay || !self.options.delay.show) { self.show() } else { self.hoverState = 'in' setTimeout(function() { if (self.hoverState == 'in') { self.show() } }, self.options.delay.show) } } , leave: function ( e ) { var self = $(e.currentTarget)[this.type](this._options).data(this.type) if (!self.options.delay || !self.options.delay.hide) { self.hide() } else { self.hoverState = 'out' setTimeout(function() { if (self.hoverState == 'out') { self.hide() } }, self.options.delay.hide) } } , show: function () { var $tip , inside , pos , actualWidth , actualHeight , placement , tp if (this.hasContent() && this.enabled) { $tip = this.tip() this.setContent() if (this.options.animation) { $tip.addClass('fade') } placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement inside = /in/.test(placement) $tip .remove() .css({ top: 0, left: 0, display: 'block' }) .appendTo(inside ? this.$element : document.body) pos = this.getPosition(inside) actualWidth = $tip[0].offsetWidth actualHeight = $tip[0].offsetHeight switch (inside ? placement.split(' ')[1] : placement) { case 'bottom': tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} break case 'top': tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} break case 'left': tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} break case 'right': tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} break } $tip .css(tp) .addClass(placement) .addClass('in') } } , setContent: function () { var $tip = this.tip() $tip.find('.tooltip-inner').html(this.getTitle()) $tip.removeClass('fade in top bottom left right') } , hide: function () { var that = this , $tip = this.tip() $tip.removeClass('in') function removeWithAnimation() { var timeout = setTimeout(function () { $tip.off($.support.transition.end).remove() }, 500) $tip.one($.support.transition.end, function () { clearTimeout(timeout) $tip.remove() }) } $.support.transition && this.$tip.hasClass('fade') ? removeWithAnimation() : $tip.remove() } , fixTitle: function () { var $e = this.$element if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') } } , hasContent: function () { return this.getTitle() } , getPosition: function (inside) { return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { width: this.$element[0].offsetWidth , height: this.$element[0].offsetHeight }) } , getTitle: function () { var title , $e = this.$element , o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) title = title.toString().replace(/(^\s*|\s*$)/, "") return title } , tip: function () { return this.$tip = this.$tip || $(this.options.template) } , validate: function () { if (!this.$element[0].parentNode) { this.hide() this.$element = null this.options = null } } , enable: function () { this.enabled = true } , disable: function () { this.enabled = false } , toggleEnabled: function () { this.enabled = !this.enabled } , toggle: function () { this[this.tip().hasClass('in') ? 'hide' : 'show']() } } /* TOOLTIP PLUGIN DEFINITION * ========================= */ $.fn.tooltip = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('tooltip') , options = typeof option == 'object' && option if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.tooltip.Constructor = Tooltip $.fn.tooltip.defaults = { animation: true , delay: 0 , selector: false , placement: 'top' , trigger: 'hover' , title: '' , template: '
' } }( window.jQuery ); /*********************************************** Begin VMM.Timeline.js ***********************************************/ /*! Timeline Designed and built by Zach Wise at VéritéCo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. http://www.gnu.org/licenses/ */ /* CodeKit Import http://incident57.com/codekit/ ================================================== */ // @codekit-prepend "VMM.Timeline.License.js"; // @codekit-prepend "Core/VMM.js"; // @codekit-prepend "Core/VMM.Library.js"; // @codekit-prepend "Core/VMM.Browser.js"; // @codekit-prepend "Core/VMM.FileExtention.js"; // @codekit-prepend "Core/VMM.Date.js"; // @codekit-prepend "Core/VMM.Util.js"; // @codekit-prepend "Core/VMM.LoadLib.js"; // @codekit-prepend "Media/VMM.ExternalAPI.js"; // @codekit-prepend "Media/VMM.MediaElement.js"; // @codekit-prepend "Media/VMM.MediaType.js"; // @codekit-prepend "Media/VMM.Media.js"; // @codekit-prepend "Media/VMM.TextElement.js"; // @codekit-prepend "Slider/VMM.TouchSlider.js"; // @codekit-prepend "Slider/VMM.DragSlider.js"; // @codekit-prepend "Slider/VMM.Slider.js"; // @codekit-prepend "Slider/VMM.Slider.Slide.js"; // @codekit-prepend "VMM.Language.js"; // @codekit-append "VMM.Timeline.TimeNav.js"; // @codekit-append "VMM.Timeline.DataObj.js"; // @codekit-prepend "lib/AES.js"; // @codekit-prepend "lib/bootstrap-tooltip.js"; /* Timeline ================================================== */ if(typeof VMM != 'undefined' && typeof VMM.Timeline == 'undefined') { VMM.Timeline = function(w, h, conf, _timeline_id) { var $timeline, $feedback, $messege, slider, timenav, version, timeline_id; var events = {}, data = {}, _dates = [], config = {}; var has_width = false, has_height = false, ie7 = false, is_moving = false; if (type.of(_timeline_id) == "string") { timeline_id = _timeline_id; } else { timeline_id = "#timeline"; } version = "1.48"; trace("TIMELINE VERSION " + version); /* CONFIG ================================================== */ config = { embed: false, events: { data_ready: "DATAREADY", messege: "MESSEGE", headline: "TIMELINE_HEADLINE", slide_change: "SLIDE_CHANGE", resize: "resize" }, id: timeline_id, type: "timeline", maptype: "toner", preload: 4, current_slide: 0, hash_bookmark: false, start_at_end: false, start_page: false, api_keys: { google: "", flickr: "", twitter: "" }, interval: 10, something: 0, width: 960, height: 540, spacing: 15, loaded: { slider: false, timenav: false, percentloaded: 0 }, nav: { start_page: false, interval_width: 200, density: 4, minor_width: 0, minor_left: 0, multiplier: { current: 6, min: .1, max: 50 }, rows: [1, 1, 1], width: 960, height: 200, marker: { width: 150, height: 48 } }, feature: { width: 960, height: 540 }, slider: { width: 720, height: 400, content: { width: 720, height: 400, padding: 130, }, nav: { width: 100, height: 200 } }, ease: "easeInOutExpo", duration: 1000, language: VMM.Language }; if ( w != null && w != "") { config.width = w; has_width = true; } if ( h != null && h != "") { config.height = h; has_height = true; } if(window.location.hash) { var hash = window.location.hash.substring(1); if (!isNaN(hash)) { config.current_slide = parseInt(hash); } } window.onhashchange = function () { if (config.hash_bookmark) { if (is_moving) { var hash = window.location.hash.substring(1); goToEvent(parseInt(hash)); } else { is_moving = false; } } } /* CREATE CONFIG ================================================== */ var createConfig = function(conf) { // APPLY SUPPLIED CONFIG TO TIMELINE CONFIG if (typeof timeline_config == 'object') { trace("HAS TIMELINE CONFIG"); var x; for (x in timeline_config) { if (Object.prototype.hasOwnProperty.call(timeline_config, x)) { config[x] = timeline_config[x]; } } } else if (typeof conf == 'object') { var x; for (x in conf) { if (Object.prototype.hasOwnProperty.call(conf, x)) { config[x] = conf[x]; } } } config.nav.width = config.width; config.nav.height = 200; config.feature.width = config.width; config.feature.height = config.height - config.nav.height; VMM.Timeline.Config = config; VMM.master_config.Timeline = VMM.Timeline.Config; this.events = config.events; } /* CREATE TIMELINE STRUCTURE ================================================== */ var createStructure = function(w, h) { $timeline = VMM.getElement(timeline_id); VMM.Lib.addClass(timeline_id, "vmm-timeline"); $feedback = VMM.appendAndGetElement($timeline, "
", "feedback", ""); $messege = VMM.appendAndGetElement($feedback, "
", "messege", "Timeline"); slider = new VMM.Slider(timeline_id + " div.slider", config); timenav = new VMM.Timeline.TimeNav(timeline_id + " div.navigation"); if (!has_width) { config.width = VMM.Lib.width($timeline); } else { VMM.Lib.width($timeline, config.width); } if (!has_height) { config.height = VMM.Lib.height($timeline); } else { VMM.Lib.height($timeline, config.height); } } /* ON EVENT ================================================== */ function onDataReady(e, d) { trace("onDataReady"); trace(d); data = d.timeline; if (type.of(data.era) == "array") { } else { data.era = []; } buildDates(); }; function onDatesProcessed() { build(); } function reSize() { updateSize(); slider.setSize(config.feature.width, config.feature.height); timenav.setSize(config.width, config.height); }; function onSliderLoaded(e) { config.loaded.slider = true; onComponentLoaded(); }; function onComponentLoaded(e) { config.loaded.percentloaded = config.loaded.percentloaded + 25; if (config.loaded.slider && config.loaded.timenav) { hideMessege(); } } function onTimeNavLoaded(e) { config.loaded.timenav = true; onComponentLoaded(); } function onSlideUpdate(e) { is_moving = true; config.current_slide = slider.getCurrentNumber(); setHash(config.current_slide); timenav.setMarker(config.current_slide, config.ease,config.duration); }; function onMarkerUpdate(e) { is_moving = true; config.current_slide = timenav.getCurrentNumber(); setHash(config.current_slide); slider.setSlide(config.current_slide); }; var goToEvent = function(n) { if (n <= _dates.length - 1 && n >= 0) { config.current_slide = n; slider.setSlide(config.current_slide); timenav.setMarker(config.current_slide, config.ease,config.duration); } } function setHash(n) { if (config.hash_bookmark) { window.location.hash = "#" + n.toString(); } } /* PUBLIC FUNCTIONS ================================================== */ this.init = function(_data, _timeline_id, conf) { if (type.of(_timeline_id) == "string") { if (_timeline_id.match("#")) { timeline_id = _timeline_id; } else { timeline_id = "#" + _timeline_id; } } createConfig(conf); createStructure(w,h); trace('TIMELINE INIT'); VMM.Date.setLanguage(VMM.Timeline.Config.language); VMM.master_config.language = VMM.Timeline.Config.language; $feedback = VMM.appendAndGetElement($timeline, "
", "feedback", ""); $messege = VMM.appendAndGetElement($feedback, "
", "messege", VMM.master_config.language.messages.loading_timeline); VMM.bindEvent(global, onDataReady, config.events.data_ready); VMM.bindEvent(global, showMessege, config.events.messege); /* GET DATA ================================================== */ if (VMM.Browser.browser == "MSIE" && parseInt(VMM.Browser.version, 10) == 7) { ie7 = true; VMM.fireEvent(global, config.events.messege, "Internet Explorer 7 is not supported by #Timeline."); } else { if (type.of(_data) == "string" || type.of(_data) == "object") { VMM.Timeline.DataObj.getData(_data); } else { VMM.Timeline.DataObj.getData(VMM.getElement(timeline_id)); } } }; this.iframeLoaded = function() { trace("iframeLoaded"); }; this.reload = function(_d) { trace("loadNewDates" + _d); $messege = VMM.appendAndGetElement($feedback, "
", "messege", VMM.master_config.language.messages.loading_timeline); data = {}; VMM.Timeline.DataObj.getData(_d); }; /* DATA ================================================== */ var getData = function(url) { VMM.getJSON(url, function(d) { data = VMM.Timeline.DataObj.getData(d); VMM.fireEvent(global, config.events.data_ready); }); }; /* MESSEGES ================================================== */ var showMessege = function(e, msg) { trace("showMessege " + msg); VMM.attachElement($messege, msg); }; var hideMessege = function() { VMM.Lib.animate($feedback, config.duration, config.ease*4, {"opacity": 0}, detachMessege); }; var detachMessege = function() { VMM.Lib.detach($feedback); } /* BUILD DISPLAY ================================================== */ var build = function() { // START AT END? if (config.start_at_end && config.current_slide == 0) { config.current_slide = _dates.length - 1; } // CREATE DOM STRUCTURE VMM.attachElement($timeline, ""); VMM.appendElement($timeline, "
"); reSize(); VMM.bindEvent("div.slider", onSliderLoaded, "LOADED"); VMM.bindEvent("div.navigation", onTimeNavLoaded, "LOADED"); VMM.bindEvent("div.slider", onSlideUpdate, "UPDATE"); VMM.bindEvent("div.navigation", onMarkerUpdate, "UPDATE"); slider.init(_dates); timenav.init(_dates, data.era); // RESIZE EVENT LISTENERS VMM.bindEvent(global, reSize, config.events.resize); //VMM.bindEvent(global, function(e) {e.preventDefault()}, "touchmove"); }; var updateSize = function() { trace("UPDATE SIZE"); config.width = VMM.Lib.width($timeline); config.height = VMM.Lib.height($timeline); config.nav.width = config.width; config.feature.width = config.width; if (VMM.Browser.device == "mobile") { //config.feature.height = config.height; } else { //config.feature.height = config.height - config.nav.height - 3; } config.feature.height = config.height - config.nav.height - 3; }; // BUILD DATE OBJECTS var buildDates = function() { _dates = []; VMM.fireEvent(global, config.events.messege, "Building Dates"); updateSize(); for(var i = 0; i < data.date.length; i++) { if (data.date[i].startDate != null && data.date[i].startDate != "") { var _date = {}; // START DATE if (data.date[i].type == "tweets") { _date.startdate = VMM.ExternalAPI.twitter.parseTwitterDate(data.date[i].startDate); } else { _date.startdate = VMM.Date.parse(data.date[i].startDate); } if (!isNaN(_date.startdate)) { // END DATE if (data.date[i].endDate != null && data.date[i].endDate != "") { if (data.date[i].type == "tweets") { _date.enddate = VMM.ExternalAPI.twitter.parseTwitterDate(data.date[i].endDate); } else { _date.enddate = VMM.Date.parse(data.date[i].endDate); } } else { _date.enddate = _date.startdate; } _date.needs_slug = false; if (data.date[i].headline == "") { if (data.date[i].slug != null && data.date[i].slug != "") { _date.needs_slug = true; } } _date.title = data.date[i].headline; _date.headline = data.date[i].headline; _date.type = data.date[i].type; _date.date = VMM.Date.prettyDate(_date.startdate); _date.asset = data.date[i].asset; _date.fulldate = _date.startdate.getTime(); _date.text = data.date[i].text; _date.content = ""; _date.tag = data.date[i].tag; _date.slug = data.date[i].slug; _date.uniqueid = VMM.Util.unique_ID(7); _dates.push(_date); } } }; /* CUSTOM SORT ================================================== */ if (data.type != "storify") { _dates.sort(function(a, b){ return a.fulldate - b.fulldate }); } /* CREATE START PAGE IF AVAILABLE ================================================== */ if (data.headline != null && data.headline != "" && data.text != null && data.text != "") { trace("HAS STARTPAGE"); var _date = {}, td_num = 0, td; td = _dates[0].startdate; _date.startdate = new Date(_dates[0].startdate); if (td.getMonth() === 0 && td.getDate() == 1 && td.getHours() === 0 && td.getMinutes() === 0 ) { // trace("YEAR ONLY"); _date.startdate.setFullYear(td.getFullYear() - 1); } else if (td.getDate() <= 1 && td.getHours() === 0 && td.getMinutes() === 0) { // trace("YEAR MONTH"); _date.startdate.setMonth(td.getMonth() - 1); } else if (td.getHours() === 0 && td.getMinutes() === 0) { // trace("YEAR MONTH DAY"); _date.startdate.setDate(td.getDate() - 1); } else if (td.getMinutes() === 0) { // trace("YEAR MONTH DAY HOUR"); _date.startdate.setHours(td.getHours() - 1); } else { // trace("YEAR MONTH DAY HOUR MINUTE"); _date.startdate.setMinutes(td.getMinutes() - 1); } _date.uniqueid = VMM.Util.unique_ID(7); _date.enddate = _date.startdate; _date.title = data.headline; _date.headline = data.headline; _date.text = data.text; _date.type = "start"; _date.date = VMM.Date.prettyDate(data.startDate); _date.asset = data.asset; _date.slug = false; _date.needs_slug = false; _date.fulldate = _date.startdate.getTime(); if (config.embed) { VMM.fireEvent(global, config.events.headline, _date.headline); } _dates.unshift(_date); } /* CUSTOM SORT ================================================== */ if (data.type != "storify") { _dates.sort(function(a, b){ return a.fulldate - b.fulldate }); } onDatesProcessed(); } }; VMM.Timeline.Config = {}; }; /*********************************************** Begin VMM.Timeline.TimeNav.js ***********************************************/ /* TIMELINE NAVIGATION ================================================== */ if(typeof VMM.Timeline != 'undefined' && typeof VMM.Timeline.TimeNav == 'undefined') { VMM.Timeline.TimeNav = function(parent, content_width, content_height) { trace("VMM.Timeline.TimeNav"); var events = {}, timespan = {}, layout = parent; var timeouts = { interval_position: "" }; var data = [], era_markers = [], markers = [], interval_array = [], interval_major_array = [], eras, content, tags = []; var timenav_pos = { left:"", visible: { left:"", right:"" } }; var current_marker = 0; var _active = false; var timelookup = {day: 24, month: 12, year: 10, hour: 60, minute: 60, second: 1000, decade: 10, century: 100, millenium: 1000, age: 1000000, epoch: 10000000, era: 100000000, eon: 500000000, week: 4.34812141, days_in_month: 30.4368499, days_in_week: 7, weeks_in_month:4.34812141, weeks_in_year:52.177457, days_in_year: 365.242199, hours_in_day: 24 }; var dateFractionBrowser = {day: 86400000, week: 7, month: 30.4166666667, year: 12, hour: 24, minute: 1440, second: 86400, decade: 10, century: 100, millenium: 1000, age: 1000000, epoch: 10000000, era: 100000000, eon: 500000000 }; var interval = {type: "year", number: 10, first: 1970, last: 2011, multiplier: 100, classname:"_idd", interval_type:"interval"}; var interval_major = {type: "year", number: 10, first: 1970, last: 2011, multiplier: 100, classname:"major", interval_type:"interval major"}; var interval_macro = {type: "year", number: 10, first: 1970, last: 2011, multiplier: 100, classname:"_dd_minor", interval_type:"interval minor"}; var interval_calc = {day: {},month: {},year: {},hour: {},minute: {}, second: {},decade: {},century: {},millenium: {},week: {}, age: {}, epoch: {}, era: {}, eon: {} }; /* ELEMENTS ================================================== */ var $timenav, $content, $time, $timeintervalminor, $timeinterval, $timeintervalmajor, $timebackground, $timeintervalbackground, $timenavline, $timenavindicator, $timeintervalminor_minor, $toolbar, $zoomin, $zoomout; /* ADD to Config ================================================== */ var config = VMM.Timeline.Config; config.nav.rows = [config.nav.marker.height, config.nav.marker.height*2, 1]; if (content_width != null && content_width != "") { config.nav.width = content_width; } if (content_height != null && content_height != "") { config.nav.height = content_height; } /* config.nav.density = 2; config.nav.multiplier = { current: 6, min: .1, max: 50 }; */ /* INIT ================================================== */ this.init = function(d,e) { trace('VMM.Timeline.TimeNav init'); // need to evaluate d // some function to determine type of data and prepare it if(typeof d != 'undefined') { this.setData(d, e); } else { trace("WAITING ON DATA"); } }; /* GETTERS AND SETTERS ================================================== */ this.setData = function(d,e) { if(typeof d != 'undefined') { data = {}; data = d; eras = e; build(); } else{ trace("NO DATA"); } }; this.setSize = function(w, h) { if (w != null) {config.width = w}; if (h != null) {config.height = h}; if (_active) { reSize(); } } this.setMarker = function(n, ease, duration, fast) { goToMarker(n, ease, duration); } this.getCurrentNumber = function() { return current_marker; } /* ON EVENT ================================================== */ function onConfigSet() { trace("onConfigSet"); }; function reSize(firstrun) { VMM.Lib.css($timenavline, "left", Math.round(config.width/2)+2); VMM.Lib.css($timenavindicator, "left", Math.round(config.width/2)-8); goToMarker(config.current_slide, config.ease, config.duration, true, firstrun); }; function upDate() { VMM.fireEvent(layout, "UPDATE"); } function onZoomIn() { VMM.DragSlider.cancelSlide(); if (config.nav.multiplier.current > config.nav.multiplier.min) { if (config.nav.multiplier.current <= 1) { config.nav.multiplier.current = config.nav.multiplier.current - .25; } else { if (config.nav.multiplier.current > 5) { if (config.nav.multiplier.current > 16) { config.nav.multiplier.current = Math.round(config.nav.multiplier.current - 10); } else { config.nav.multiplier.current = Math.round(config.nav.multiplier.current - 4); } } else { config.nav.multiplier.current = Math.round(config.nav.multiplier.current - 1); } } if (config.nav.multiplier.current <= 0) { config.nav.multiplier.current = config.nav.multiplier.min; } refreshTimeline(); } } function onZoomOut() { VMM.DragSlider.cancelSlide(); if (config.nav.multiplier.current < config.nav.multiplier.max) { if (config.nav.multiplier.current > 4) { if (config.nav.multiplier.current > 16) { config.nav.multiplier.current = Math.round(config.nav.multiplier.current + 10); } else { config.nav.multiplier.current = Math.round(config.nav.multiplier.current + 4); } } else { config.nav.multiplier.current = Math.round(config.nav.multiplier.current + 1); } if (config.nav.multiplier.current >= config.nav.multiplier.max) { config.nav.multiplier.current = config.nav.multiplier.max; } refreshTimeline(); } } function onBackHome(e) { VMM.DragSlider.cancelSlide(); goToMarker(0); upDate(); } var refreshTimeline = function() { trace("config.nav.multiplier " + config.nav.multiplier.current); positionMarkers(true); positionInterval($timeinterval, interval_array, true, true); positionInterval($timeintervalmajor, interval_major_array, true); }; /* MARKER EVENTS ================================================== */ function onMarkerClick(e) { VMM.DragSlider.cancelSlide(); goToMarker(e.data.number); upDate(); }; function onMarkerHover(e) { VMM.Lib.toggleClass(e.data.elem, "zFront"); }; var goToMarker = function(n, ease, duration, fast, firstrun) { var _ease = config.ease, _duration = config.duration, is_last = false, is_first = false; current_marker = n; timenav_pos.left = (config.width/2) - VMM.Lib.position(markers[current_marker].marker).left; timenav_pos.visible.left = Math.abs(timenav_pos.left) - 100; timenav_pos.visible.right = Math.abs(timenav_pos.left) + config.width + 100; if (current_marker == 0) { is_first = true; } if (current_marker +1 == markers.length) { is_last = true } if (ease != null && ease != "") {_ease = ease}; if (duration != null && duration != "") {_duration = duration}; // set marker style for(var i = 0; i < markers.length; i++) { VMM.Lib.removeClass(markers[i].marker, "active"); } if (config.start_page && markers[0].type == "start") { VMM.Lib.visible(markers[0].marker, false); VMM.Lib.addClass(markers[0].marker, "start"); } VMM.Lib.addClass(markers[current_marker].marker, "active"); // ANIMATE MARKER VMM.Lib.stop($timenav); VMM.Lib.animate($timenav, _duration, _ease, {"left": timenav_pos.left}); } /* TOUCH EVENTS ================================================== */ function onTouchUpdate(e, b) { VMM.Lib.animate($timenav, b.time/2, config.ease, {"left": b.left}); }; /* CALCULATIONS ================================================== */ var averageMarkerPositionDistance = function() { var last_pos = 0, pos = 0, pos_dif = 0, mp_diff = []; for(var i = 0; i < markers.length; i++) { if (data[i].type == "start") { } else { var _pos = positionOnTimeline(interval, markers[i].relative_pos), last_pos = pos; pos = _pos.begin; pos_dif = pos - last_pos; mp_diff.push(pos_dif); } } return VMM.Util.average(mp_diff).mean; } var averageDateDistance = function() { var last_dd = 0; var dd = 0; var date_dif = 0; var date_diffs = []; var is_first_date = true; for(var i = 0; i < data.length; i++) { if (data[i].type == "start") { trace("DATA DATE IS START") } else { var _dd = data[i].startdate; last_dd = dd; dd = _dd; date_dif = dd - last_dd; date_diffs.push(date_dif); } } return VMM.Util.average(date_diffs); } var calculateMultiplier = function() { var temp_multiplier = config.nav.multiplier.current; for(var i = 0; i < temp_multiplier; i++) { if (averageMarkerPositionDistance() < 75) { if (config.nav.multiplier.current > 1) { config.nav.multiplier.current = config.nav.multiplier.current - 1; } } } } var calculateInterval = function() { // NEED TO REWRITE ALL OF THIS var _first = getDateFractions(data[0].startdate); var _last = getDateFractions(data[data.length - 1].enddate); // EON interval_calc.eon.type = "eon"; interval_calc.eon.first = _first.eons; interval_calc.eon.base = Math.floor(_first.eons); interval_calc.eon.last = _last.eons; interval_calc.eon.number = timespan.eons; interval_calc.eon.multiplier = timelookup.eons; interval_calc.eon.minor = timelookup.eons; // ERA interval_calc.era.type = "era"; interval_calc.era.first = _first.eras; interval_calc.era.base = Math.floor(_first.eras); interval_calc.era.last = _last.eras; interval_calc.era.number = timespan.eras; interval_calc.era.multiplier = timelookup.eras; interval_calc.era.minor = timelookup.eras; // EPOCH interval_calc.epoch.type = "epoch"; interval_calc.epoch.first = _first.epochs; interval_calc.epoch.base = Math.floor(_first.epochs); interval_calc.epoch.last = _last.epochs; interval_calc.epoch.number = timespan.epochs; interval_calc.epoch.multiplier = timelookup.epochs; interval_calc.epoch.minor = timelookup.epochs; // AGE interval_calc.age.type = "age"; interval_calc.age.first = _first.ages; interval_calc.age.base = Math.floor(_first.ages); interval_calc.age.last = _last.ages; interval_calc.age.number = timespan.ages; interval_calc.age.multiplier = timelookup.ages; interval_calc.age.minor = timelookup.ages; // MILLENIUM interval_calc.millenium.type = "millenium"; interval_calc.millenium.first = _first.milleniums; interval_calc.millenium.base = Math.floor(_first.milleniums); interval_calc.millenium.last = _last.milleniums; interval_calc.millenium.number = timespan.milleniums; interval_calc.millenium.multiplier = timelookup.millenium; interval_calc.millenium.minor = timelookup.millenium; // CENTURY interval_calc.century.type = "century"; interval_calc.century.first = _first.centuries; interval_calc.century.base = Math.floor(_first.centuries); interval_calc.century.last = _last.centuries; interval_calc.century.number = timespan.centuries; interval_calc.century.multiplier = timelookup.century; interval_calc.century.minor = timelookup.century; // DECADE interval_calc.decade.type = "decade"; interval_calc.decade.first = _first.decades; interval_calc.decade.base = Math.floor(_first.decades); interval_calc.decade.last = _last.decades; interval_calc.decade.number = timespan.decades; interval_calc.decade.multiplier = timelookup.decade; interval_calc.decade.minor = timelookup.decade; // YEAR interval_calc.year.type = "year"; interval_calc.year.first = _first.years; interval_calc.year.base = Math.floor(_first.years); interval_calc.year.last = _last.years; interval_calc.year.number = timespan.years; interval_calc.year.multiplier = 1; interval_calc.year.minor = timelookup.month; // MONTH interval_calc.month.type = "month"; interval_calc.month.first = _first.months; interval_calc.month.base = Math.floor(_first.months); interval_calc.month.last = _last.months; interval_calc.month.number = timespan.months; interval_calc.month.multiplier = 1; interval_calc.month.minor = Math.round(timelookup.week); // WEEK // NOT DONE interval_calc.week.type = "week"; interval_calc.week.first = _first.weeks; interval_calc.week.base = Math.floor(_first.weeks); interval_calc.week.last = _last.weeks; interval_calc.week.number = timespan.weeks; interval_calc.week.multiplier = 1; interval_calc.week.minor = 7; // DAY interval_calc.day.type = "day"; interval_calc.day.first = _first.days; interval_calc.day.base = Math.floor(_first.days); interval_calc.day.last = _last.days; interval_calc.day.number = timespan.days; interval_calc.day.multiplier = 1; interval_calc.day.minor = 24; // HOUR interval_calc.hour.type = "hour"; interval_calc.hour.first = _first.hours; interval_calc.hour.base = Math.floor(_first.hours); interval_calc.hour.last = _last.hours; interval_calc.hour.number = timespan.hours; interval_calc.hour.multiplier = 1; interval_calc.hour.minor = 60; // MINUTE interval_calc.minute.type = "minute"; interval_calc.minute.first = _first.minutes; interval_calc.minute.base = Math.floor(_first.minutes); interval_calc.minute.last = _last.minutes; interval_calc.minute.number = timespan.minutes; interval_calc.minute.multiplier = 1; interval_calc.minute.minor = 60; // SECOND interval_calc.second.type = "decade"; interval_calc.second.first = _first.seconds; interval_calc.second.base = Math.floor(_first.seconds); interval_calc.second.last = _last.seconds; interval_calc.second.number = timespan.seconds; interval_calc.second.multiplier = 1; interval_calc.second.minor = 10; } var getDateFractions = function(the_date, is_utc) { var _time = {}; _time.days = the_date / dateFractionBrowser.day; _time.weeks = _time.days / dateFractionBrowser.week; _time.months = _time.days / dateFractionBrowser.month; _time.years = _time.months / dateFractionBrowser.year; _time.hours = _time.days * dateFractionBrowser.hour; _time.minutes = _time.days * dateFractionBrowser.minute; _time.seconds = _time.days * dateFractionBrowser.second; _time.decades = _time.years / dateFractionBrowser.decade; _time.centuries = _time.years / dateFractionBrowser.century; _time.milleniums = _time.years / dateFractionBrowser.millenium; _time.ages = _time.years / dateFractionBrowser.age; _time.epochs = _time.years / dateFractionBrowser.epoch; _time.eras = _time.years / dateFractionBrowser.era; _time.eons = _time.years / dateFractionBrowser.eon; /* trace("AGES " + _time.ages); trace("EPOCHS " + _time.epochs); trace("MILLENIUMS " + _time.milleniums); trace("CENTURIES " + _time.centuries); trace("DECADES " + _time.decades); trace("YEARS " + _time.years); trace("MONTHS " + _time.months); trace("WEEKS " + _time.weeks); trace("DAYS " + _time.days); trace("HOURS " + _time.hours); trace("MINUTES " + _time.minutes); trace("SECONDS " + _time.seconds); */ return _time; } /* POSITION ================================================== */ var positionRelative = function(_interval, first, last) { var _first, _last, _type = _interval.type, timerelative = {start: "", end: "", type: _type}; /* FIRST ================================================== */ _first = getDateFractions(first); timerelative.start = first.months; if (_type == "eon") { timerelative.start = _first.eons; } else if (_type == "era") { timerelative.start = _first.eras; } else if (_type == "epoch") { timerelative.start = _first.epochs; } else if (_type == "age") { timerelative.start = _first.ages; } else if (_type == "millenium") { timerelative.start = first.milleniums; } else if (_type == "century") { timerelative.start = _first.centuries; } else if (_type == "decade") { timerelative.start = _first.decades; } else if (_type == "year") { timerelative.start = _first.years; } else if (_type == "month") { timerelative.start = _first.months; } else if (_type == "week") { timerelative.start = _first.weeks; } else if (_type == "day") { timerelative.start = _first.days; } else if (_type == "hour") { timerelative.start = _first.hours; } else if (_type == "minute") { timerelative.start = _first.minutes; } /* LAST ================================================== */ if (type.of(last) == "date") { _last = getDateFractions(last); timerelative.end = last.months; if (_type == "eon") { timerelative.end = _last.eons; } else if (_type == "era") { timerelative.end = _last.eras; } else if (_type == "epoch") { timerelative.end = _last.epochs; } else if (_type == "age") { timerelative.end = _last.ages; } else if (_type == "millenium") { timerelative.end = last.milleniums; } else if (_type == "century") { timerelative.end = _last.centuries; } else if (_type == "decade") { timerelative.end = _last.decades; } else if (_type == "year") { timerelative.end = _last.years; } else if (_type == "month") { timerelative.end = _last.months; } else if (_type == "week") { timerelative.end = _last.weeks; } else if (_type == "day") { timerelative.end = _last.days; } else if (_type == "hour") { timerelative.end = _last.hours; } else if (_type == "minute") { timerelative.end = _last.minutes; } } else { timerelative.end = timerelative.start; } return timerelative } var positionOnTimeline = function(the_interval, timerelative) { return { begin: (timerelative.start - interval.base) * (config.nav.interval_width / config.nav.multiplier.current), end: (timerelative.end - interval.base) * (config.nav.interval_width / config.nav.multiplier.current) }; } var positionMarkers = function(is_animated) { var _type = interval.type, _multiplier = interval.multiplier, row = 2, lpos = 0, row_depth = 0, _line_last_height_pos = 150, _line_height = 6, cur_mark = 0, in_view_margin = config.width, in_view = { left: timenav_pos.visible.left - in_view_margin, right: timenav_pos.visible.right + in_view_margin }; config.nav.minor_width = config.width; VMM.Lib.removeClass(".flag", "row1"); VMM.Lib.removeClass(".flag", "row2"); VMM.Lib.removeClass(".flag", "row3"); for(var i = 0; i < markers.length; i++) { var _line, _marker = markers[i].marker, _marker_flag = markers[i].flag, _marker_line_event = markers[i].lineevent, _pos = positionOnTimeline(interval, markers[i].relative_pos), _pos_offset = -2, is_in_view = false; pos = _pos.begin; _pos_end = _pos.end; // COMPENSATE FOR DATES BEING POITIONED IN THE MIDDLE pos = Math.round(pos + _pos_offset); _pos_end = Math.round(_pos_end + _pos_offset); _line = Math.round(_pos_end - pos); if (current_marker == i) { timenav_pos.left = (config.width/2) - pos; timenav_pos.visible.left = Math.abs(timenav_pos.left); timenav_pos.visible.right = Math.abs(timenav_pos.left) + config.width; in_view.left = timenav_pos.visible.left - in_view_margin; in_view.right = timenav_pos.visible.right + in_view_margin; } if (Math.abs(pos) >= in_view.left && Math.abs(pos) <= in_view.right ) { is_in_view = true; } // APPLY POSITION TO MARKER if (is_animated) { VMM.Lib.stop(_marker); VMM.Lib.animate(_marker, config.duration/2, config.ease, {"left": pos}); } else { VMM.Lib.stop(_marker); VMM.Lib.css(_marker, "left", pos); } if (i == current_marker) { cur_mark = pos; } // EVENT LENGTH LINE if (_line > 5) { VMM.Lib.css(_marker_line_event, "height", _line_height); VMM.Lib.css(_marker_line_event, "width", _line); VMM.Lib.css(_marker_line_event, "top", _line_last_height_pos); } // CONTROL ROW POSITION if (tags.length > 0) { for (var k = 0; k < tags.length; k++) { trace("TAGS: " + tags[k]) if (k < config.nav.rows.length) { if (markers[i].tag == tags[k]) { trace("tag match " + k); row = k; } } } } else { if (pos - lpos < (config.nav.marker.width + config.spacing)) { if (row < config.nav.rows.length - 1) { row ++; } else { row = 0; row_depth ++; } } else { row_depth = 0; row = 0; } } // SET LAST MARKER POSITION lpos = pos; if (is_animated && is_in_view) { VMM.Lib.stop(_marker_flag); VMM.Lib.animate(_marker_flag, config.duration, config.ease, {"top": config.nav.rows[row]}); } else { VMM.Lib.stop(_marker_flag); VMM.Lib.css(_marker_flag, "top", config.nav.rows[row]); } // IS THE MARKER A REPRESENTATION OF A START SCREEN? if (config.start_page && markers[i].type == "start") { VMM.Lib.visible(_marker, false); } if (pos > config.nav.minor_width) { config.nav.minor_width = pos; } if (pos < config.nav.minor_left) { config.nav.minor_left = pos; } } for(var j = 0; j < era_markers.length; j++) { var _line, era = era_markers[j], era_elem = era.content, pos = positionOnTimeline(interval, era.relative_pos), era_length = pos.end - pos.begin, era_height = 25; // APPLY POSITION TO MARKER VMM.Lib.css(era_elem, "left", pos.begin); VMM.Lib.css(era_elem, "width", era_length); } // ANIMATE THE TIMELINE TO ADJUST TO CHANGES VMM.Lib.stop($timenav); VMM.Lib.animate($timenav, config.duration/2, config.ease, {"left": (config.width/2) - (cur_mark)}); //VMM.Lib.delay_animate(config.duration, $timenav, config.duration/2, config.ease, {"left": (config.width/2) - (cur_mark)}); } var positionInterval = function(the_main_element, the_intervals, is_animated, is_minor) { var _type = interval.type, _multiplier = interval.multiplier, last_position = 0, last_position_major = 0, //in_view_margin = (config.nav.minor_width/config.nav.multiplier.current)/2, in_view_margin = config.width, in_view = { left: timenav_pos.visible.left - in_view_margin, right: timenav_pos.visible.right + in_view_margin } not_too_many = true; config.nav.minor_left = 0; if (the_intervals.length > 100) { not_too_many = false; trace("TOO MANY " + the_intervals.length); } for(var i = 0; i < the_intervals.length; i++) { var _interval = the_intervals[i].interval_element, _interval_date = the_intervals[i].interval_date, _interval_visible = the_intervals[i].interval_visible, _pos = positionOnTimeline(interval, the_intervals[i].relative_pos), pos = _pos.begin, _animation = the_intervals[i].animation, is_visible = true, is_in_view = false, pos_offset = 50; _animation.pos = pos; _animation.animate = false; if (Math.abs(pos) >= in_view.left && Math.abs(pos) <= in_view.right ) { is_in_view = true; } if (true) { // CONDENSE WHAT IS DISPLAYED if (config.nav.multiplier.current > 16 && is_minor) { is_visible = false; } else { if ((pos - last_position) < 65 ) { if ((pos - last_position) < 35 ) { if (i%4 == 0) { if (pos == 0) { is_visible = false; } } else { is_visible = false; } } else { if (!VMM.Util.isEven(i)) { is_visible = false; } } } } if (is_visible) { if (the_intervals[i].is_detached) { VMM.Lib.append(the_main_element, _interval); the_intervals[i].is_detached = false; } } else { the_intervals[i].is_detached = true; VMM.Lib.detach(_interval); } if (_interval_visible) { if (!is_visible) { _animation.opacity = "0"; if (is_animated && not_too_many) { _animation.animate = true; } the_intervals[i].interval_visible = false; } else { _animation.opacity = "100"; if (is_animated && is_in_view) { _animation.animate = true; } } } else { _animation.opacity = "100"; if (is_visible) { if (is_animated && not_too_many) { _animation.animate = true; } else { if (is_animated && is_in_view) { _animation.animate = true; } } the_intervals[i].interval_visible = true; } else { if (is_animated && not_too_many) { _animation.animate = true; } } } last_position = pos; if (pos > config.nav.minor_width) { config.nav.minor_width = pos; } if (pos < config.nav.minor_left) { config.nav.minor_left = pos; trace("MINOR " + pos); } } if (_animation.animate) { VMM.Lib.animate(_interval, config.duration/2, config.ease, {opacity: _animation.opacity, left: _animation.pos}); } else { VMM.Lib.css(_interval, "opacity", _animation.opacity); VMM.Lib.css(_interval, "left", pos); } } VMM.Lib.css($timeintervalminor_minor, "left", config.nav.minor_left - (config.width)/2); VMM.Lib.width($timeintervalminor_minor, (config.nav.minor_width)+(config.width) + Math.abs(config.nav.minor_left) ); //trace((config.nav.minor_width/config.nav.multiplier.current)/2) /* for(var k = 0; k < the_intervals.length; k++) { var _animation = the_intervals[k].animation; if (_animation.animate) { var _interval = the_intervals[k].interval_element; VMM.Lib.animate(_interval, config.duration/2, config.ease, {opacity: _animation.opacity, left: _animation.pos}, "interval_que"); } } */ } var createIntervalElements = function(_interval, _array, _element_parent) { var inc_time = 0, _first_run = true, _last_pos = 0, _largest_pos = 0; VMM.attachElement(_element_parent, ""); _interval.date = new Date(data[0].startdate.getFullYear(), 0, 1, 0,0,0); for(var i = 0; i < Math.ceil(_interval.number) + 1; i++) { var _idd, _pos, pos, _date, _visible = false, _relative_pos, _element = VMM.appendAndGetElement(_element_parent, "
", _interval.classname); if (_interval.type == "eon") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 500000000) * 500000000 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 500000000)); } else if (_interval.type == "era") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 100000000) * 100000000 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 100000000)); } else if (_interval.type == "epoch") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 10000000) * 10000000 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 10000000)); } else if (_interval.type == "age") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 1000000) * 1000000 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 1000000)); } else if (_interval.type == "millenium") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 1000) * 1000 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 1000)); } else if (_interval.type == "century") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 100) * 100 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 100)); } else if (_interval.type == "decade") { if (_first_run) { _interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 10) * 10 ); } _interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 10)); } else if (interval.type == "year") { if (_first_run) { } _interval.date.setFullYear(_interval.date.getFullYear() + inc_time); } else if (_interval.type == "month") { if (_first_run) { _interval.date.setMonth(data[0].startdate.getMonth()); } _interval.date.setMonth(_interval.date.getMonth() + inc_time); } else if (_interval.type == "week") { if (_first_run) { _interval.date.setMonth( data[0].startdate.getMonth() ); _interval.date.setDate( Math.floor(data[0].startdate.getDate() *7) ); } _interval.date.setDate(_interval.date.getDate() + (inc_time * 7) ); } else if (_interval.type == "day") { if (_first_run) { _interval.date.setMonth( data[0].startdate.getMonth() ); _interval.date.setDate( data[0].startdate.getDate() ); } _interval.date.setDate(_interval.date.getDate() + inc_time); } else if (_interval.type == "hour") { if (_first_run) { _interval.date.setMonth( data[0].startdate.getMonth() ); _interval.date.setDate( data[0].startdate.getDate() ); _interval.date.setHours( data[0].startdate.getHours() ); } _interval.date.setHours(_interval.date.getHours() + inc_time); } else if (_interval.type == "minute") { if (_first_run) { _interval.date.setMonth( data[0].startdate.getMonth() ); _interval.date.setDate( data[0].startdate.getDate() ); _interval.date.setHours( data[0].startdate.getHours() ); _interval.date.setMinutes( data[0].startdate.getMinutes() ); } _interval.date.setMinutes(_interval.date.getMinutes() + inc_time); } else if (_interval.type == "second") { if (_first_run) { _interval.date.setMonth( data[0].startdate.getMonth() ); _interval.date.setDate( data[0].startdate.getDate() ); _interval.date.setHours( data[0].startdate.getHours() ); _interval.date.setMinutes( data[0].startdate.getMinutes() ); _interval.date.setSeconds( data[0].startdate.getSeconds() ); } _interval.date.setSeconds(_interval.date.getSeconds() + inc_time); } _idd = VMM.Date.prettyDate(_interval.date, true); inc_time = 1; _first_run = false; _relative_pos = positionRelative(interval, _interval.date); //_pos = positionOnTimeline(_interval, _interval.date); //pos = _pos.begin; pos = _relative_pos.begin; VMM.appendElement(_element, _idd); VMM.Lib.css(_element, "text-indent", -(VMM.Lib.width(_element)/2)); VMM.Lib.css(_element, "opacity", "0"); _last_pos = pos; if (pos > _largest_pos) { _largest_pos = pos; } _date = new Date(_interval.date); var _obj = { interval_element: _element, interval_date: _date, interval_visible: _visible, type: _interval.interval_type, relative_pos: _relative_pos, is_detached: false, animation: { animate: false, pos: "", opacity: "100" } }; _array.push(_obj); } VMM.Lib.width($timeintervalminor_minor, _largest_pos); positionInterval(_element_parent, _array); } /* BUILD ================================================== */ var build = function() { VMM.attachElement(layout, ""); $timenav = VMM.appendAndGetElement(layout, "
", "timenav"); $content = VMM.appendAndGetElement($timenav, "
", "content"); $time = VMM.appendAndGetElement($timenav, "
", "time"); $timeintervalminor = VMM.appendAndGetElement($time, "
", "time-interval-minor"); $timeintervalminor_minor = VMM.appendAndGetElement($timeintervalminor, "
", "minor"); $timeintervalmajor = VMM.appendAndGetElement($time, "
", "time-interval-major"); $timeinterval = VMM.appendAndGetElement($time, "
", "time-interval"); $timebackground = VMM.appendAndGetElement(layout, "
", "timenav-background"); $timenavline = VMM.appendAndGetElement($timebackground, "
", "timenav-line"); $timenavindicator = VMM.appendAndGetElement($timebackground, "
", "timenav-indicator"); $timeintervalbackground = VMM.appendAndGetElement($timebackground, "
", "timenav-interval-background", "
"); $toolbar = VMM.appendAndGetElement(layout, "
", "toolbar"); buildInterval(); buildMarkers(); calculateMultiplier(); positionMarkers(); positionInterval($timeinterval, interval_array, false, true); positionInterval($timeintervalmajor, interval_major_array); //reSize(true); if (config.start_page) { $backhome = VMM.appendAndGetElement($toolbar, "
", "back-home", "
"); VMM.bindEvent(".back-home", onBackHome, "click"); VMM.Lib.css($toolbar, "top", 27); VMM.Lib.attribute($backhome, "title", VMM.master_config.language.messages.return_to_title); VMM.Lib.attribute($backhome, "rel", "tooltip"); } $zoomin = VMM.appendAndGetElement($toolbar, "
", "zoom-in", "
"); $zoomout = VMM.appendAndGetElement($toolbar, "
", "zoom-out", "
"); VMM.Lib.attribute($zoomin, "title", VMM.master_config.language.messages.expand_timeline); VMM.Lib.attribute($zoomin, "rel", "tooltip"); VMM.Lib.attribute($zoomout, "title", VMM.master_config.language.messages.contract_timeline); VMM.Lib.attribute($zoomout, "rel", "tooltip"); $toolbar.tooltip({selector: "div[rel=tooltip]", placement: "right"}) // MAKE TIMELINE TOUCHABLE if (VMM.Browser.device == "mobile" || VMM.Browser.device == "tablet") { VMM.TouchSlider.createPanel($timebackground, $timenav, config.width, config.spacing, false); VMM.bindEvent($timenav, onTouchUpdate, "TOUCHUPDATE"); } else { VMM.DragSlider.createPanel(layout, $timenav, config.width, config.spacing, false); } VMM.bindEvent(".zoom-in", onZoomIn, "click"); VMM.bindEvent(".zoom-out", onZoomOut, "click"); VMM.fireEvent(layout, "LOADED"); _active = true; reSize(true); }; var buildInterval = function() { // CALCULATE INTERVAL timespan = getDateFractions((data[data.length - 1].enddate) - (data[0].startdate), true); trace(timespan); calculateInterval(); /* DETERMINE DEFAULT INTERVAL TYPE millenium, ages, epoch, era and eon are not working yet ================================================== */ /* if (timespan.eons > data.length / config.nav.density) { interval = interval_calc.eon; interval_major = interval_calc.eon; interval_macro = interval_calc.era; } else if (timespan.eras > data.length / config.nav.density) { interval = interval_calc.era; interval_major = interval_calc.eon; interval_macro = interval_calc.epoch; } else if (timespan.epochs > data.length / config.nav.density) { interval = interval_calc.epoch; interval_major = interval_calc.era; interval_macro = interval_calc.age; } else if (timespan.ages > data.length / config.nav.density) { interval = interval_calc.ages; interval_major = interval_calc.epoch; interval_macro = interval_calc.millenium; } else if (timespan.milleniums > data.length / config.nav.density) { interval = interval_calc.millenium; interval_major = interval_calc.age; interval_macro = interval_calc.century; } else */ if (timespan.centuries > data.length / config.nav.density) { interval = interval_calc.century; interval_major = interval_calc.millenium; interval_macro = interval_calc.decade; } else if (timespan.decades > data.length / config.nav.density) { interval = interval_calc.decade; interval_major = interval_calc.century; interval_macro = interval_calc.year; } else if (timespan.years > data.length / config.nav.density) { interval = interval_calc.year; interval_major = interval_calc.decade; interval_macro = interval_calc.month; } else if (timespan.months > data.length / config.nav.density) { interval = interval_calc.month; interval_major = interval_calc.year; interval_macro = interval_calc.day; } else if (timespan.days > data.length / config.nav.density) { interval = interval_calc.day; interval_major = interval_calc.month; interval_macro = interval_calc.hour; } else if (timespan.hours > data.length / config.nav.density) { interval = interval_calc.hour; interval_major = interval_calc.day; interval_macro = interval_calc.minute; } else if (timespan.minutes > data.length / config.nav.density) { interval = interval_calc.minute; interval_major = interval_calc.hour; interval_macro = interval_calc.second; } else if (timespan.seconds > data.length / config.nav.density) { interval = interval_calc.second; interval_major = interval_calc.minute; interval_macro = interval_calc.second; } else { trace("NO IDEA WHAT THE TYPE SHOULD BE"); interval = interval_calc.day; interval_major = interval_calc.month; interval_macro = interval_calc.hour; } trace("INTERVAL TYPE: " + interval.type); trace("INTERVAL MAJOR TYPE: " + interval_major.type); createIntervalElements(interval, interval_array, $timeinterval); createIntervalElements(interval_major, interval_major_array, $timeintervalmajor); } var buildMarkers = function() { var row = 2, lpos = 0, row_depth = 0; markers = []; era_markers = []; for(var i = 0; i < data.length; i++) { var _marker, _marker_flag, _marker_content, _marker_dot, _marker_line, _marker_line_event, _marker_title = "", has_title = false; _marker = VMM.appendAndGetElement($content, "
", "marker"); _marker_flag = VMM.appendAndGetElement(_marker, "
", "flag"); _marker_content = VMM.appendAndGetElement(_marker_flag, "
", "flag-content"); _marker_dot = VMM.appendAndGetElement(_marker, "
", "dot"); _marker_line = VMM.appendAndGetElement(_marker, "
", "line"); _marker_line_event = VMM.appendAndGetElement(_marker_line, "
", "event-line"); _marker_relative_pos = positionRelative(interval, data[i].startdate, data[i].enddate); _marker_thumb = ""; // THUMBNAIL if (data[i].asset != null && data[i].asset != "") { VMM.appendElement(_marker_content, VMM.MediaElement.thumbnail(data[i].asset, 24, 24, data[i].uniqueid)); } else { VMM.appendElement(_marker_content, "
"); } // ADD DATE AND TITLE if (data[i].title == "" || data[i].title == " " ) { trace("TITLE NOTHING") if (typeof data[i].slug != 'undefined' && data[i].slug != "") { trace("SLUG") _marker_title = VMM.Util.untagify(data[i].slug); has_title = true; } else { var m = VMM.MediaType(data[i].asset.media); if (m.type == "quote" || m.type == "unknown") { _marker_title = VMM.Util.untagify(m.id); has_title = true; } else if (m.type == "twitter") { has_title = false; VMM.appendElement(_marker_content, "

" + _marker_title + "

"); } else { has_title = false; } } } else if (data[i].title != "" || data[i].title != " ") { trace(data[i].title) _marker_title = VMM.Util.untagify(data[i].title); has_title = true; } else { trace("TITLE SLUG NOT FOUND " + data[i].slug) } if (has_title) { VMM.appendElement(_marker_content, "

" + _marker_title + "

"); } // ADD ID VMM.Lib.attr(_marker, "id", ( "marker_" + data[i].uniqueid).toString() ); // MARKER CLICK VMM.bindEvent(_marker_flag, onMarkerClick, "", {number: i}); VMM.bindEvent(_marker_flag, onMarkerHover, "mouseenter mouseleave", {number: i, elem:_marker_flag}); var _marker_obj = { marker: _marker, flag: _marker_flag, lineevent: _marker_line_event, type: "marker", relative_pos: _marker_relative_pos, tag: data[i].tag }; if (data[i].type == "start") { trace("BUILD MARKER HAS START PAGE"); config.start_page = true; _marker_obj.type = "start"; } if (data[i].type == "storify") { _marker_obj.type = "storify"; } if (data[i].tag) { tags.push(data[i].tag); } markers.push(_marker_obj); } // CREATE TAGS tags = VMM.Util.deDupeArray(tags); for(var k = 0; k < tags.length; k++) { if (k < config.nav.rows.length) { var tag_element = VMM.appendAndGetElement($timebackground, "
", "timenav-tag"); VMM.Lib.addClass(tag_element, "timenav-tag-row-" + (k+1)); VMM.appendElement(tag_element, "

" + tags[k] + "

"); } } // CREATE ERAS for(var j = 0; j < eras.length; j++) { var era = { content: VMM.appendAndGetElement($content, "
", "era"), startdate: VMM.Util.parseDate(eras[j].startDate), enddate: VMM.Util.parseDate(eras[j].endDate), title: eras[j].headline, uniqueid: VMM.Util.unique_ID(4), color: eras[j].color, relative_pos: "" }; era.relative_pos = positionRelative(interval, eras[j].startdate, eras[j].enddate); VMM.Lib.attr(era.content, "id", era.uniqueid); VMM.Lib.css(era.content, "background", era.color); VMM.appendElement(era.content, "

" + VMM.Util.unlinkify(era.title) + "

"); era_markers.push(era); } } }; } /*********************************************** Begin 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 = {}; 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 { trace("DATA SOURCE: JSON"); VMM.getJSON(raw_data, 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"); } }, 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) { 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: { getData: function(raw) { var _key = VMM.Util.getUrlVars(raw)["key"]; var _url = "https://spreadsheets.google.com/feeds/list/" + _key + "/od6/public/values?alt=json"; VMM.getJSON(_url, VMM.Timeline.DataObj.model.googlespreadsheet.buildData); }, buildData: function(d) { VMM.fireEvent(global, VMM.Timeline.Config.events.messege, "Parsing Data"); var _data_obj = VMM.Timeline.DataObj.data_template_obj; for(var i = 0; i < d.feed.entry.length; i++) { var dd = d.feed.entry[i]; if (dd.gsx$titleslide.$t.match("start")) { _data_obj.timeline.startDate = dd.gsx$startdate.$t; _data_obj.timeline.headline = dd.gsx$headline.$t; _data_obj.timeline.asset.media = dd.gsx$media.$t; _data_obj.timeline.asset.caption = dd.gsx$mediacaption.$t; _data_obj.timeline.asset.credit = dd.gsx$mediacredit.$t; _data_obj.timeline.text = dd.gsx$text.$t; _data_obj.timeline.type = "google spreadsheet"; } else { var _date = { "type": "google spreadsheet", "startDate": dd.gsx$startdate.$t, "endDate": dd.gsx$enddate.$t, "headline": dd.gsx$headline.$t, "text": dd.gsx$text.$t, "asset": { "media": dd.gsx$media.$t, "credit": dd.gsx$mediacredit.$t, "caption": dd.gsx$mediacaption.$t }, "tags": "Optional" }; if (typeof dd.gsx$tag != 'undefined') { _date.tag = dd.gsx$tag.$t; } _data_obj.timeline.date.push(_date); } }; VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, _data_obj); } }, storify: { getData: function(raw) { //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..."); var _key = raw.split("storify.com\/")[1]; var _url = "http://api.storify.com/v1/stories/" + _key + "?per_page=300&callback=?"; var 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 += "
" //tt += " " + "" + " "; tt += "
"; tt += "" tt += "" + t_name + ""; tt += "" + t_nickname + ""; tt += ""; //tt += "" + d.content.author.stats.stories + " Stories"; //tt += "" + d.content.author.stats.subscribers + " Subscribers"; tt += "
" tt += "
"; _data_obj.timeline.text = tt; _data_obj.timeline.asset.media = d.content.thumbnail; //_data_obj.timeline.asset.media = dd.gsx$media.$t; //_data_obj.timeline.asset.caption = dd.gsx$mediacaption.$t; //_data_obj.timeline.asset.credit = dd.gsx$mediacredit.$t; _data_obj.timeline.type = "storify"; for(var i = 0; i < d.content.elements.length; i++) { var dd = d.content.elements[i]; var is_text = false; var d_date = new Date(dd.posted_at); //trace(tempdat); trace(dd.type); //trace(dd); var _date = { "type": "storify", "startDate": dd.posted_at, "endDate": dd.posted_at, "headline": " ", "slug": "", "text": "", "asset": { "media": "", "credit": "", "caption": "" } }; /* MEDIA ================================================== */ if (dd.type == "image") { if (typeof dd.source.name != 'undefined') { if (dd.source.name == "flickr") { _date.asset.media = "http://flickr.com/photos/" + dd.meta.pathalias + "/" + dd.meta.id + "/"; _date.asset.credit = "" + dd.attribution.name + ""; _date.asset.credit += " on " + dd.source.name + ""; } else if (dd.source.name == "instagram") { _date.asset.media = dd.permalink; _date.asset.credit = "" + dd.attribution.name + ""; _date.asset.credit += " on " + dd.source.name + ""; } else { _date.asset.credit = "" + dd.attribution.name + ""; if (typeof dd.source.href != 'undefined') { _date.asset.credit += " on " + dd.source.name + ""; } _date.asset.media = dd.data.image.src; } } else { _date.asset.credit = "" + dd.attribution.name + ""; _date.asset.media = dd.data.image.src; } _date.slug = dd.attribution.name; if (typeof dd.data.image.caption != 'undefined') { if (dd.data.image.caption != 'undefined') { _date.asset.caption = dd.data.image.caption; _date.slug = dd.data.image.caption; } } } else if (dd.type == "quote") { if (dd.permalink.match("twitter")) { _date.asset.media = dd.permalink; _date.slug = VMM.Util.untagify(dd.data.quote.text); } else if (dd.permalink.match("storify")) { is_text = true; _date.asset.media = "
" + 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 += "

" + dd.data.text.replace(/<\s*\/?\s*b\s*.*?>/g,"") + "

"; //asset_text += " " + "" + " "; asset_text += "
"; _date.text = asset_text; // Try and put it before the element where it is expected on storify if ( (i+1) >= d.content.elements.length ) { _date.startDate = d.content.elements[i-1].posted_at; } else { if (d.content.elements[i+1].type == "text" && d.content.elements[i+1].permalink.match("storify")) { if ( (i+2) >= d.content.elements.length ) { _date.startDate = d.content.elements[i-1].posted_at; } else { if (d.content.elements[i+2].type == "text" && d.content.elements[i+2].permalink.match("storify")) { if ( (i+3) >= d.content.elements.length ) { _date.startDate = d.content.elements[i-1].posted_at; } else { if (d.content.elements[i+3].type == "text" && d.content.elements[i+3].permalink.match("storify")) { _date.startDate = d.content.elements[i-1].posted_at; } else { trace("LEVEL 3"); _date.startDate = d.content.elements[i+3].posted_at; } } } else { trace("LEVEL 2"); _date.startDate = d.content.elements[i+2].posted_at; } } } else { trace("LEVEL 1"); _date.startDate = d.content.elements[i+1].posted_at; } } _date.endDate = _date.startDate } } else if (dd.type == "video") { _date.headline = dd.data.video.title; _date.asset.caption = dd.data.video.description; _date.asset.caption = dd.source.username; _date.asset.media = dd.data.video.src; } else { trace("NO MATCH "); trace(dd); } if (is_text) { _date.slug = VMM.Util.untagify(dd.data.text); } _data_obj.timeline.date.push(_date); }; VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, _data_obj); } }, tweets: { type: "twitter", buildData: function(raw_data) { VMM.bindEvent(global, VMM.Timeline.DataObj.model.tweets.onTwitterDataReady, "TWEETSLOADED"); VMM.ExternalAPI.twitter.getTweets(raw_data.timeline.tweets); }, getData: function(raw_data) { VMM.bindEvent(global, VMM.Timeline.DataObj.model.tweets.onTwitterDataReady, "TWEETSLOADED"); VMM.ExternalAPI.twitter.getTweetSearch(raw_data); }, onTwitterDataReady: function(e, d) { var _data_obj = VMM.Timeline.DataObj.data_template_obj; for(var i = 0; i < d.tweetdata.length; i++) { var _date = { "type":"tweets", "startDate":"", "headline":"", "text":"", "asset": { "media":"", "credit":"", "caption":"" }, "tags":"Optional" }; // pass in the 'created_at' string returned from twitter // // stamp arrives formatted as Tue Apr 07 22:52:51 +0000 2009 // //var twit_date = VMM.ExternalAPI.twitter.parseTwitterDate(d.tweetdata[i].raw.created_at); //trace(twit_date); _date.startDate = d.tweetdata[i].raw.created_at; if (type.of(d.tweetdata[i].raw.from_user_name)) { _date.headline = d.tweetdata[i].raw.from_user_name + " (" + "@" + d.tweetdata[i].raw.from_user + ")" ; } else { _date.headline = d.tweetdata[i].raw.user.name + " (" + "@" + d.tweetdata[i].raw.user.screen_name + ")" ; } _date.asset.media = d.tweetdata[i].content; _data_obj.timeline.date.push(_date); }; VMM.fireEvent(global, VMM.Timeline.Config.events.data_ready, _data_obj); } } }, /* TEMPLATE OBJECTS ================================================== */ data_template_obj: { "timeline": { "headline":"", "description":"", "asset": { "media":"", "credit":"", "caption":"" }, "date": [] } }, date_obj: {"startDate":"2012,2,2,11,30", "headline":"", "text":"", "asset": {"media":"http://youtu.be/vjVfu8-Wp6s", "credit":"", "caption":"" }, "tags":"Optional"} }; }