From 61b1482d99405ab5b687f41cb1c7f475fd0d7279 Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Tue, 22 May 2012 16:57:17 +0100 Subject: [PATCH 1/3] [#73,view/timeline][l]: functioning timeline view using VeriteCo Timeline library. * *Much* still to do such as auto-selection of date field, checking for end date, parsing of dates, generation of summary text etc --- src/view-timeline.js | 68 + test/index.html | 4 + test/view-timeline.test.js | 16 + vendor/timeline/20120520/css/timeline.css | 180 + vendor/timeline/20120520/css/timeline.png | Bin 0 -> 9370 bytes vendor/timeline/20120520/js/timeline.js | 7637 +++++++++++++++++++++ 6 files changed, 7905 insertions(+) create mode 100644 src/view-timeline.js create mode 100644 test/view-timeline.test.js create mode 100644 vendor/timeline/20120520/css/timeline.css create mode 100644 vendor/timeline/20120520/css/timeline.png create mode 100644 vendor/timeline/20120520/js/timeline.js diff --git a/src/view-timeline.js b/src/view-timeline.js new file mode 100644 index 00000000..ef9bc09e --- /dev/null +++ b/src/view-timeline.js @@ -0,0 +1,68 @@ +/*jshint multistr:true */ + +this.recline = this.recline || {}; +this.recline.View = this.recline.View || {}; + +(function($, my) { +my.Timeline = Backbone.View.extend({ + tagName: 'div', + className: 'recline-timeline', + + template: ' \ +
\ + ', + + initialize: function() { + var self = this; + this.el = $(this.el); + this.render(); + this.bind('view:show', function() { + // set width explicitly o/w timeline goes wider that screen for some reason + self.el.find('#vmm-timeline-id').width(self.el.parent().width()); + // only call initTimeline once in DOM as Timeline uses $ internally to look up element + self.initTimeline(); + }); + }, + + render: function() { + var tmplData = {}; + var htmls = $.mustache(this.template, tmplData); + this.el.html(htmls); + }, + + initTimeline: function() { + var config = { + width: "300px", + height: "50%" + }; + var data = this._timelineJSON(); + var elementId = '#vmm-timeline-id'; + this.timeline = new VMM.Timeline(); + this.timeline.init(data, elementId, config); + }, + + _timelineJSON: function() { + var self = this; + var out = { + 'timeline': { + 'type': 'default', + 'headline': ' ', + 'date': [ + ] + } + }; + this.model.currentDocuments.each(function(doc) { + var tlEntry = { + "startDate": doc.get('date'), + "headline": String(doc.get(self.model.fields.models[0].id)), + "text": '' + }; + if (tlEntry.startDate) { + out.timeline.date.push(tlEntry); + } + }); + return out; + } +}); + +})(jQuery, recline.View); diff --git a/test/index.html b/test/index.html index 8e25198c..1d2e4ee5 100644 --- a/test/index.html +++ b/test/index.html @@ -6,6 +6,7 @@ + @@ -14,6 +15,7 @@ + @@ -39,10 +41,12 @@ + + diff --git a/test/view-timeline.test.js b/test/view-timeline.test.js new file mode 100644 index 00000000..15ca17fc --- /dev/null +++ b/test/view-timeline.test.js @@ -0,0 +1,16 @@ +module("View - Timeline"); + +test('basics', function () { + var dataset = Fixture.getDataset(); + var view = new recline.View.Timeline({ + model: dataset + }); + $('.fixtures').append(view.el); + view.initTimeline(); + assertPresent('.vmm-timeline', view.el); + assertPresent('.timenav', view.el); + assertPresent('.timenav', view.el); + equal('2011', view.el.find('.marker.active h4').text()); + view.remove(); +}); + diff --git a/vendor/timeline/20120520/css/timeline.css b/vendor/timeline/20120520/css/timeline.css new file mode 100644 index 00000000..de0e7329 --- /dev/null +++ b/vendor/timeline/20120520/css/timeline.css @@ -0,0 +1,180 @@ +.vmm-timeline{}.vmm-timeline div *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +.vmm-timeline h1,.vmm-timeline h2,.vmm-timeline h3,.vmm-timeline h4,.vmm-timeline h5,.vmm-timeline h6,.vmm-timeline p,.vmm-timeline blockquote,.vmm-timeline pre,.vmm-timeline a,.vmm-timeline abbr,.vmm-timeline acronym,.vmm-timeline address,.vmm-timeline cite,.vmm-timeline code,.vmm-timeline del,.vmm-timeline dfn,.vmm-timeline em,.vmm-timeline img,.vmm-timeline q,.vmm-timeline s,.vmm-timeline samp,.vmm-timeline small,.vmm-timeline strike,.vmm-timeline strong,.vmm-timeline sub,.vmm-timeline sup,.vmm-timeline tt,.vmm-timeline var,.vmm-timeline dd,.vmm-timeline dl,.vmm-timeline dt,.vmm-timeline li,.vmm-timeline ol,.vmm-timeline ul,.vmm-timeline fieldset,.vmm-timeline form,.vmm-timeline label,.vmm-timeline legend,.vmm-timeline button,.vmm-timeline table,.vmm-timeline caption,.vmm-timeline tbody,.vmm-timeline tfoot,.vmm-timeline thead,.vmm-timeline tr,.vmm-timeline th,.vmm-timeline td,.vmm-timeline .container,.vmm-timeline .content-container,.vmm-timeline .media,.vmm-timeline .text,.vmm-timeline .slider,.vmm-timeline .date,.vmm-timeline .title,.vmm-timeline .messege,.vmm-timeline .map,.vmm-timeline .credit,.vmm-timeline .caption,.vmm-timeline .feedback,.vmm-timeline .feature,.vmm-timeline .toolbar,.vmm-timeline .marker,.vmm-timeline .dot,.vmm-timeline .line,.vmm-timeline .flag,.vmm-timeline .time,.vmm-timeline .era,.vmm-timeline .major,.vmm-timeline .minor,.vmm-timeline .navigation,.vmm-timeline .start,.vmm-timeline .active{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;} +.vmm-timeline table{border-collapse:collapse;border-spacing:0;} +.vmm-timeline ol,.vmm-timeline ul{list-style:none;} +.vmm-timeline q:before,.vmm-timeline q:after,.vmm-timeline blockquote:before,.vmm-timeline blockquote:after{content:"";} +.vmm-timeline a:focus{outline:thin dotted;} +.vmm-timeline a:hover,.vmm-timeline a:active{outline:0;} +.vmm-timeline article,.vmm-timeline aside,.vmm-timeline details,.vmm-timeline figcaption,.vmm-timeline figure,.vmm-timeline footer,.vmm-timeline header,.vmm-timeline hgroup,.vmm-timeline nav,.vmm-timeline section{display:block;} +.vmm-timeline audio,.vmm-timeline canvas,.vmm-timeline video{display:inline-block;*display:inline;*zoom:1;} +.vmm-timeline audio:not([controls]){display:none;} +.vmm-timeline div{max-width:none;} +.vmm-timeline sub,.vmm-timeline sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;} +.vmm-timeline sup{top:-0.5em;} +.vmm-timeline sub{bottom:-0.25em;} +.vmm-timeline img{border:0;-ms-interpolation-mode:bicubic;} +.vmm-timeline button,.vmm-timeline input,.vmm-timeline select,.vmm-timeline textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;} +.vmm-timeline button,.vmm-timeline input{line-height:normal;*overflow:visible;} +.vmm-timeline button::-moz-focus-inner,.vmm-timeline input::-moz-focus-inner{border:0;padding:0;} +.vmm-timeline button,.vmm-timeline input[type="button"],.vmm-timeline input[type="reset"],.vmm-timeline input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +.vmm-timeline input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +.vmm-timeline input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;} +.vmm-timeline textarea{overflow:auto;vertical-align:top;} +.vmm-timeline{font-family:"Georgia",Times New Roman,Times,serif;}.vmm-timeline .twitter,.vmm-timeline .messege,.vmm-timeline .credit,.vmm-timeline .caption,.vmm-timeline .zoom-in,.vmm-timeline .zoom-out,.vmm-timeline .back-home,.vmm-timeline .time-interval div,.vmm-timeline .time-interval-major div,.vmm-timeline .nav-container{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;} +.vmm-timeline h1.date,.vmm-timeline h2.date,.vmm-timeline h3.date,.vmm-timeline h4.date,.vmm-timeline h5.date,.vmm-timeline h6.date{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;} +.vmm-timeline .timenav h1,.vmm-timeline .flag-content h1,.vmm-timeline .era h1,.vmm-timeline .timenav h2,.vmm-timeline .flag-content h2,.vmm-timeline .era h2,.vmm-timeline .timenav h3,.vmm-timeline .flag-content h3,.vmm-timeline .era h3,.vmm-timeline .timenav h4,.vmm-timeline .flag-content h4,.vmm-timeline .era h4,.vmm-timeline .timenav h5,.vmm-timeline .flag-content h5,.vmm-timeline .era h5,.vmm-timeline .timenav h6,.vmm-timeline .flag-content h6,.vmm-timeline .era h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;} +.vmm-timeline p,.vmm-timeline blockquote,.vmm-timeline blockquote p,.vmm-timeline .twitter blockquote p{font-family:"Georgia",Times New Roman,Times,serif !important;} +.vmm-timeline .feature h1,.vmm-timeline .feature h2,.vmm-timeline .feature h3,.vmm-timeline .feature h4,.vmm-timeline .feature h5,.vmm-timeline .feature h6{font-family:"Georgia",Times New Roman,Times,serif;} +.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +#timeline-embed{background-color:#ffffff;margin-bottom:20px;border:1px solid #cccccc;padding-top:20px;padding-bottom:20px;clear:both;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-box-shadow:1px 1px 3px rgba(0, 0, 0, 0.35);-moz-box-shadow:1px 1px 3px rgba(0, 0, 0, 0.35);box-shadow:1px 1px 3px rgba(0, 0, 0, 0.35);} +#timeline-embed.full-embed{overflow:hidden;border:0 !important;padding:0 !important;margin:0 !important;clear:both;-webkit-border-radius:0 !important;-moz-border-radius:0 !important;border-radius:0 !important;-webkit-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;-moz-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;box-shadow:0px 0px 0px rgba(0, 0, 0, 0.25) !important;} +#timeline-embed.sized-embed{overflow:hidden;border:1px solid #cccccc;padding-top:7px;padding-bottom:7px;margin:0 !important;clear:both;-webkit-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;-moz-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;box-shadow:0px 0px 0px rgba(0, 0, 0, 0.25) !important;} +.vmm-timeline{width:100%;height:100%;padding:0px;margin:0px;background-color:#ffffff;position:absolute;z-index:100;clear:both;overflow:hidden;}.vmm-timeline .feature{width:100%;}.vmm-timeline .feature .slider{width:100%;float:left;position:relative;z-index:10;padding-top:15px;-webkit-box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);} +.vmm-timeline .feedback{position:absolute;display:table;overflow:hidden;top:0px;left:0px;z-index:205;width:100%;height:100%;background-color:#ffffff;}.vmm-timeline .feedback .messege{display:table-cell;vertical-align:middle;font-size:15px;font-weight:normal;line-height:20px;width:75%;margin-left:auto;margin-right:auto;margin-top:auto;margin-bottom:auto;text-align:center;} +.vmm-timeline .container.main{position:absolute;top:0px: left:0px;padding-bottom:3px;width:auto;height:auto;margin:0px;clear:both;} +.vmm-timeline img,.vmm-timeline embed,.vmm-timeline object,.vmm-timeline video,.vmm-timeline iframe{max-width:100%;} +.vmm-timeline img{max-height:100%;border:1px solid #999999;} +.vmm-timeline a{color:#0088cc;text-decoration:none;} +.vmm-timeline a:hover{color:#005580;text-decoration:underline;} +.vmm-timeline .thumbnail{width:24px;height:24px;overflow:hidden;float:left;margin-right:1px;margin-top:6px;} +.vmm-timeline .thumbnail.thumb-plaintext{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-280px -48px;} +.vmm-timeline .thumbnail.thumb-quote{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-232px -48px;} +.vmm-timeline .thumbnail.thumb-document{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-256px -48px;} +.vmm-timeline .thumbnail.thumb-photo{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-280px -24px;border:0;}.vmm-timeline .thumbnail.thumb-photo img{border:0px none #cccccc !important;} +.vmm-timeline .thumbnail.thumb-twitter{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-256px -24px;} +.vmm-timeline .thumbnail.thumb-vimeo{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-328px -48px;} +.vmm-timeline .thumbnail.thumb-youtube{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-328px -72px;} +.vmm-timeline .thumbnail.thumb-video{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-328px -24px;} +.vmm-timeline .thumbnail.thumb-audio{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-304px -24px;} +.vmm-timeline .thumbnail.thumb-map{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-208px -48px;} +.vmm-timeline .thumbnail.thumb-website{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-232px -24px;} +.vmm-timeline .thumbnail.thumb-wikipedia{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-184px -48px;} +.vmm-timeline .zFront{z-index:204;} +.slider{width:100%;height:100%;overflow:hidden;}.slider .slider-container-mask{text-align:center;width:100%;height:100%;overflow:hidden;}.slider .slider-container-mask .slider-container{position:absolute;top:0px;left:-2160px;width:100%;height:100%;text-align:center;display:block;background-color:#ffffff;}.slider .slider-container-mask .slider-container .slider-item-container{display:table-cell;vertical-align:middle;} +.slider img,.slider embed,.slider object,.slider video,.slider iframe{max-width:100%;} +.slider .nav-previous,.slider .nav-next{position:absolute;top:0px;width:100px;color:#DBDBDB;font-size:11px;}.slider .nav-previous .nav-container,.slider .nav-next .nav-container{height:100px;width:100px;position:absolute;} +.slider .nav-previous .icon,.slider .nav-next .icon{margin-top:12px;margin-bottom:15px;} +.slider .nav-previous .date,.slider .nav-next .date,.slider .nav-previous .title,.slider .nav-next .title{line-height:14px;}.slider .nav-previous .date a,.slider .nav-next .date a,.slider .nav-previous .title a,.slider .nav-next .title a{color:#999999;} +.slider .nav-previous .date small,.slider .nav-next .date small,.slider .nav-previous .title small,.slider .nav-next .title small{display:none;} +.slider .nav-previous .date,.slider .nav-next .date{font-size:13px;line-height:13px;font-weight:bold;text-transform:uppercase;margin-bottom:5px;} +.slider .nav-previous .title,.slider .nav-next .title{font-size:11px;line-height:13px;} +.slider .nav-previous:hover,.slider .nav-next:hover{color:#333333;cursor:pointer;} +.slider .nav-previous{float:left;text-align:left;}.slider .nav-previous .icon{margin-left:15px;height:24px;background-image:url(timeline.png);background-repeat:no-repeat;background-position:-160px 0;width:24px;height:24px;overflow:hidden;} +.slider .nav-previous .date,.slider .nav-previous .title{text-align:left;padding-left:15px;} +.slider .nav-previous:hover .icon{margin-left:10px;} +.slider .nav-next{float:right;text-align:right;}.slider .nav-next .icon{margin-left:61px;background-image:url(timeline.png);background-repeat:no-repeat;background-position:-184px 0;width:24px;height:24px;height:24px;overflow:hidden;} +.slider .nav-next .date,.slider .nav-next .title{text-align:right;padding-right:15px;} +.slider .nav-next:hover .icon{margin-left:66px;} +.slider .slider-item{position:absolute;width:700px;height:100%;padding:0px;margin:0px;display:table;overflow-y:auto;}.slider .slider-item .content{display:table-cell;vertical-align:middle;}.slider .slider-item .content .pad-top .text .container{padding-top:15px;} +.slider .slider-item .content .pad-right .text .container{padding-right:15px;} +.slider .slider-item .content .pad-left .text .container{padding-left:30px;} +.slider .slider-item .content .pad-left .media.text-media .media-wrapper .media-container{border:none;background-color:#ffffff;} +.slider .slider-item .content .content-container{display:table;vertical-align:middle;}.slider .slider-item .content .content-container .text{width:40%;max-width:50%;min-width:120px;display:table-cell;vertical-align:middle;}.slider .slider-item .content .content-container .text .container{display:table-cell;vertical-align:middle;text-align:left;}.slider .slider-item .content .content-container .text .container p{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-wrap:break-word;} +.slider .slider-item .content .content-container .media{width:100%;min-width:50%;float:left;}.slider .slider-item .content .content-container .media .media-wrapper{margin-left:auto;margin-right:auto;}.slider .slider-item .content .content-container .media .media-wrapper .media-container{display:inline-block;line-height:0px;padding:0px;max-height:100%;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-frame,.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-image img{border:1px solid;border-color:#cccccc #999999 #999999 #cccccc;background:#ffffff;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .soundcloud{border:0;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-image{display:inline-block;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-shadow{position:relative;z-index:1;background:#ffffff;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-shadow:before,.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-shadow:after{z-index:-1;position:absolute;content:"";bottom:15px;left:10px;width:50%;top:80%;max-width:300px;background:#999999;-webkit-box-shadow:0 15px 10px #999999;-moz-box-shadow:0 15px 10px #999999;box-shadow:0 15px 10px #999999;-webkit-transform:rotate(-2deg);-moz-transform:rotate(-2deg);-o-transform:rotate(-2deg);-ms-transform:rotate(-2deg);transform:rotate(-2deg);} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .media-shadow::after{-webkit-transform:rotate(2deg);-moz-transform:rotate(2deg);-o-transform:rotate(2deg);-ms-transform:rotate(2deg);transform:rotate(2deg);right:10px;left:auto;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container span.messege{display:block;vertical-align:middle;margin-left:auto;margin-right:auto;text-align:center;background:#ffffff;font-size:28px;font-weight:bold;text-transform:uppercase;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .plain-text{display:table;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .plain-text .container{display:table-cell;vertical-align:middle;font-size:15px;line-height:20px;color:#666666;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .plain-text .container p{margin-bottom:20px;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter{text-align:left;margin-left:auto;margin-right:auto;margin-bottom:15px;clear:both;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter blockquote{font-size:15px;line-height:20px;color:#666666;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter blockquote p{font-size:28px;line-height:36px;margin-bottom:6px;padding-top:10px;background-color:#ffffff;color:#000000;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter blockquote .quote-mark{color:#666666;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .created-at{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-256px -24px;width:24px;height:24px;overflow:hidden;margin-left:15px;display:inline-block;float:right;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .created-at:hover{filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard{float:right;margin-bottom:15px;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard a{color:#333333;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard a:hover{text-decoration:none;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard a:hover .fn{text-decoration:underline;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .fn,.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .nickname{padding-left:42px;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .fn{display:block;font-weight:bold;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .nickname{margin-top:3px;display:block;color:#666666;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .avatar{float:left;display:block;width:32px;height:32px;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .twitter .vcard .avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia{font-size:15px;line-height:20px;text-align:left;margin-left:auto;margin-right:auto;margin-bottom:15px;clear:both;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia .wiki-source{margin-bottom:15px;font-size:13px;line-height:19px;font-style:italic;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia h4{border-bottom:1px solid #cccccc;margin-bottom:5px;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia h4 a{color:#000000;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia h4 a:hover{color:#0088cc;text-decoration:none;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .wikipedia p{font-size:13px;line-height:19px;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .map{line-height:normal;z-index:200;text-align:left;background-color:#ffffff;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .map img{max-height:none !important;max-width:none !important;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .map .google-map{height:100%;width:100%;} +.slider .slider-item .content .content-container .media .media-wrapper .media-container .map .map-attribution{position:absolute;z-index:201;bottom:0px;width:100%;overflow:hidden;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .map .map-attribution .attribution-text{height:19px;overflow:hidden;-webkit-user-select:none;line-height:19px;margin-right:60px;padding-left:65px;font-family:Arial,sans-serif;font-size:10px;color:#444;white-space:nowrap;color:#ffffff;text-shadow:1px 1px 1px #333333;text-align:center;}.slider .slider-item .content .content-container .media .media-wrapper .media-container .map .map-attribution .attribution-text a{color:#ffffff !important;} +.slider .slider-item .content .content-container .media .media-wrapper .credit{color:#999999;text-align:right;display:block;margin:0 auto;margin-top:6px;font-size:10px;line-height:13px;} +.slider .slider-item .content .content-container .media .media-wrapper .caption{text-align:left;margin-top:10px;color:#666666;font-size:11px;line-height:14px;text-rendering:optimizeLegibility;} +.slider .slider-item .content .media.text-media .media-wrapper .media-container{border:none;background-color:#ffffff;} +.slider .slider-item .content-container.layout-text-media .text-media{border-top:1px solid #e3e3e3;padding-top:15px;padding-right:0;} +.slider .slider-item .content-container.layout-text-media.pad-left .text-media{padding-right:15px;padding-top:0;border-right:1px solid #e3e3e3;border-top:0px solid #e3e3e3;} +.slider .slider-item .content-container.layout-text{width:100%;}.slider .slider-item .content-container.layout-text .text{width:100%;max-width:100%;}.slider .slider-item .content-container.layout-text .text .container{display:block;vertical-align:middle;text-align:left;padding:0px;width:90%;text-align:left;margin-left:auto;margin-right:auto;} +.slider .slider-item .content-container.layout-media{width:100%;}.slider .slider-item .content-container.layout-media .text{width:100%;height:100%;max-width:100%;display:block;text-align:center;}.slider .slider-item .content-container.layout-media .text .container{display:block;text-align:center;width:100%;margin-left:none;margin-right:none;} +.slider .slider-item .content-container.layout-media .media{width:100%;min-width:50%;float:none;}.slider .slider-item .content-container.layout-media .media .media-wrapper{display:block;}.slider .slider-item .content-container.layout-media .media .media-wrapper .media-container{margin-left:auto;margin-right:auto;line-height:0px;padding:0px;} +.slider .slider-item .content-container.layout-media .twitter,.slider .slider-item .content-container.layout-media .wikipedia{max-width:70%;} +.vmm-timeline .navigation{clear:both;cursor:move;width:100%;height:200px;border-top:1px solid #e3e3e3;position:relative;}.vmm-timeline .navigation .toolbar{position:absolute;top:45px;left:0px;z-index:202;background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:1px 1px 0px rgba(0, 0, 0, 0.2);-moz-box-shadow:1px 1px 0px rgba(0, 0, 0, 0.2);box-shadow:1px 1px 0px rgba(0, 0, 0, 0.2);}.vmm-timeline .navigation .toolbar .zoom-in,.vmm-timeline .navigation .toolbar .zoom-out,.vmm-timeline .navigation .toolbar .back-home{font-weight:normal;font-size:10px;line-height:20px;top:0px;z-index:202;width:18px;height:18px;color:#333333;text-align:center;font-weight:bold;border:1px solid #ffffff;padding:5px;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} +.vmm-timeline .navigation .toolbar .zoom-in:hover,.vmm-timeline .navigation .toolbar .zoom-out:hover,.vmm-timeline .navigation .toolbar .back-home:hover{color:#0088cc;cursor:pointer;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} +.vmm-timeline .navigation .toolbar .zoom-in .icon{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-256px 0;width:24px;height:24px;} +.vmm-timeline .navigation .toolbar .zoom-out .icon{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-280px 0;width:24px;height:24px;} +.vmm-timeline .navigation .toolbar .back-home .icon{background-image:url(timeline.png);background-repeat:no-repeat;background-position:-328px 0;width:24px;height:24px;} +.vmm-timeline .navigation .timenav-background{position:absolute;cursor:move;top:0px;left:0px;height:150px;width:100%;background-color:#e9e9e9;}.vmm-timeline .navigation .timenav-background .timenav-interval-background{position:absolute;top:151px;left:0px;background:#ffffff;width:100%;height:49px;-webkit-box-shadow:-1px -1px 7px rgba(0, 0, 0, 0.1);-moz-box-shadow:-1px -1px 7px rgba(0, 0, 0, 0.1);box-shadow:-1px -1px 7px rgba(0, 0, 0, 0.1);}.vmm-timeline .navigation .timenav-background .timenav-interval-background .top-highlight{position:absolute;top:-1px;left:0px;z-index:30;width:100%;height:1px;background:#ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;-webkit-box-shadow:1px 1px 5px rgba(0, 0, 0, 0.2);-moz-box-shadow:1px 1px 5px rgba(0, 0, 0, 0.2);box-shadow:1px 1px 5px rgba(0, 0, 0, 0.2);} +.vmm-timeline .navigation .timenav-background .timenav-line{position:absolute;top:0px;left:50%;width:3px;height:150px;background:#0088cc;z-index:201;-webkit-box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);box-shadow:1px 1px 7px rgba(0, 0, 0, 0.3);} +.vmm-timeline .navigation .timenav-background .timenav-indicator{position:absolute;top:-1px;left:50%;z-index:202;background-image:url(timeline.png);background-repeat:no-repeat;background-position:-160px -48px;width:24px;height:24px;} +.vmm-timeline .navigation .timenav-background .timenav-tag{height:50px;}.vmm-timeline .navigation .timenav-background .timenav-tag div{height:50px;display:table;}.vmm-timeline .navigation .timenav-background .timenav-tag div h3{display:table-cell;vertical-align:middle;padding-left:65px;font-size:15px;color:#9d9d9d;} +.vmm-timeline .navigation .timenav-background .timenav-tag-row-2{background:#f1f1f1;} +.vmm-timeline .navigation .timenav-background .timenav-tag-row-3{background:#e9e9e9;} +.vmm-timeline .navigation .timenav{position:absolute;top:0px;left:-250px;z-index:1;}.vmm-timeline .navigation .timenav .content{position:relative;}.vmm-timeline .navigation .timenav .content .marker.start{display:none;} +.vmm-timeline .navigation .timenav .content .marker.active .dot{background:#0088cc;z-index:200;} +.vmm-timeline .navigation .timenav .content .marker.active .line{z-index:199;background:#0088cc;width:1px;}.vmm-timeline .navigation .timenav .content .marker.active .line .event-line{background:#0088cc;filter:alpha(opacity=75);-khtml-opacity:0.75;-moz-opacity:0.75;opacity:0.75;} +.vmm-timeline .navigation .timenav .content .marker.active .flag{z-index:200;background-image:url(timeline.png);background-repeat:no-repeat;background-position:0 -53px;width:153px;height:53px;}.vmm-timeline .navigation .timenav .content .marker.active .flag .flag-content h3{color:#0088cc;} +.vmm-timeline .navigation .timenav .content .marker.active .flag .flag-content .thumbnail{opacity:1;-moz-opacity:1;filter:alpha(opacity=100);} +.vmm-timeline .navigation .timenav .content .marker.active .flag.row1,.vmm-timeline .navigation .timenav .content .marker.active .flag.row2,.vmm-timeline .navigation .timenav .content .marker.active .flag.row3{z-index:200;} +.vmm-timeline .navigation .timenav .content .marker.active:hover{cursor:default;}.vmm-timeline .navigation .timenav .content .marker.active:hover .flag .flag-content h3{color:#0088cc;} +.vmm-timeline .navigation .timenav .content .marker.active:hover .flag .flag-content h4{color:#999999;} +.vmm-timeline .navigation .timenav .content .marker:hover .line{z-index:24;background:#999999;} +.vmm-timeline .navigation .timenav .content .marker{position:absolute;top:0px;left:150px;display:block;}.vmm-timeline .navigation .timenav .content .marker .dot{position:absolute;top:150px;left:0px;display:block;width:6px;height:6px;background:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;z-index:21;} +.vmm-timeline .navigation .timenav .content .marker .line{position:absolute;top:0px;left:3px;width:1px;height:150px;background:#cccccc;-moz-box-shadow:1px 0 0 #ffffff;-webkit-box-shadow:1px 0 0 #ffffff;box-shadow:1px 0 0 #ffffff;z-index:22;}.vmm-timeline .navigation .timenav .content .marker .line .event-line{position:absolute;z-index:22;left:0px;height:1px;width:1px;background:#0088cc;filter:alpha(opacity=15);-khtml-opacity:0.15;-moz-opacity:0.15;opacity:0.15;} +.vmm-timeline .navigation .timenav .content .marker .flag{position:absolute;top:15px;left:3px;padding:0px;display:block;z-index:23;width:153px;height:56px;background-image:url(timeline.png);background-repeat:no-repeat;background-position:0 0;width:153px;height:53px;}.vmm-timeline .navigation .timenav .content .marker .flag .flag-content{padding:0px 7px 2px 6px;overflow:hidden;height:36px;}.vmm-timeline .navigation .timenav .content .marker .flag .flag-content h3{font-weight:bold;font-size:15px;line-height:20px;font-size:11px;line-height:11px;color:#999999;margin-top:5px;margin-bottom:2px;}.vmm-timeline .navigation .timenav .content .marker .flag .flag-content h3 small{display:none;} +.vmm-timeline .navigation .timenav .content .marker .flag .flag-content h4{display:none;font-weight:normal;font-size:15px;line-height:20px;margin-top:5px;font-size:10px;line-height:10px;color:#aaaaaa;}.vmm-timeline .navigation .timenav .content .marker .flag .flag-content h4 small{display:none;} +.vmm-timeline .navigation .timenav .content .marker .flag .flag-content .thumbnail{margin-bottom:15px;margin-right:3px;opacity:0.5;-moz-opacity:0.5;filter:alpha(opacity=50);}.vmm-timeline .navigation .timenav .content .marker .flag .flag-content .thumbnail img{width:22px;height:22px;max-height:none;max-width:none;border:0;border:1px solid #999999;padding:0;margin:0;} +.vmm-timeline .navigation .timenav .content .marker .flag:hover{cursor:pointer;background-image:url(timeline.png);background-repeat:no-repeat;background-position:0 -53px;width:153px;height:53px;}.vmm-timeline .navigation .timenav .content .marker .flag:hover .flag-content h3{color:#333333;} +.vmm-timeline .navigation .timenav .content .marker .flag:hover .flag-content h4{color:#aaaaaa;} +.vmm-timeline .navigation .timenav .content .marker .flag:hover .flag-content .thumbnail{opacity:1;-moz-opacity:1;filter:alpha(opacity=100);} +.vmm-timeline .navigation .timenav .content .marker .flag.row1{z-index:25;top:48px;} +.vmm-timeline .navigation .timenav .content .marker .flag.row2{z-index:24;top:96px;} +.vmm-timeline .navigation .timenav .content .marker .flag.row3{z-index:23;top:1px;} +.vmm-timeline .navigation .timenav .content .marker .flag.zFront{z-index:201;} +.vmm-timeline .navigation .timenav .content .era{position:absolute;top:138px;left:150px;height:12px;display:block;background:#0088cc;overflow:hidden;border-left:1px solid #cccccc;border-right:1px solid #cccccc;border-top:1px solid #cccccc;filter:alpha(opacity=75);-khtml-opacity:0.75;-moz-opacity:0.75;opacity:0.75;-moz-border-radius-topleft:7px;-webkit-border-top-left-radius:7px;border-top-left-radius:7px;-moz-border-radius-topright:7px;-webkit-border-top-right-radius:7px;border-top-right-radius:7px;z-index:-10;}.vmm-timeline .navigation .timenav .content .era h3{font-weight:bold;font-size:10px;line-height:10px;color:#ffffff;position:absolute;top:-1px;left:9px;} +.vmm-timeline .navigation .timenav .time{position:absolute;left:0px;top:150px;height:50px;background-color:#ffffff;}.vmm-timeline .navigation .timenav .time .time-interval-minor{max-width:none;height:6px;white-space:nowrap;position:absolute;top:-9px;left:8px;z-index:10;}.vmm-timeline .navigation .timenav .time .time-interval-minor .minor{position:relative;top:2px;display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAMCAMAAACdvocfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFzMzM////040VdgAAAAJ0Uk5T/wDltzBKAAAAEklEQVR42mJgYAQCBopJgAADAAbwADHy2qHzAAAAAElFTkSuQmCC);width:100px;height:6px;background-position:center top;white-space:nowrap;color:#666666;margin-top:0px;padding-top:0px;} +.vmm-timeline .navigation .timenav .time .time-interval{white-space:nowrap;position:absolute;top:5px;left:0px;}.vmm-timeline .navigation .timenav .time .time-interval div{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAMCAMAAACdvocfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFzMzM////040VdgAAAAJ0Uk5T/wDltzBKAAAAEklEQVR42mJgYAQCBopJgAADAAbwADHy2qHzAAAAAElFTkSuQmCC);background-position:left top;background-repeat:no-repeat;padding-top:3px;position:absolute;height:3px;left:0px;display:block;font-weight:normal;font-size:10px;line-height:20px;text-transform:uppercase;text-align:left;text-indent:0px;white-space:nowrap;color:#666666;margin-left:0px;margin-right:0px;margin-top:1px;z-index:2;}.vmm-timeline .navigation .timenav .time .time-interval div strong{font-weight:bold;color:#000000;} +.vmm-timeline .navigation .timenav .time .time-interval-major{white-space:nowrap;position:absolute;top:5px;left:0px;}.vmm-timeline .navigation .timenav .time .time-interval-major div{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAMCAMAAACdvocfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFzMzM////040VdgAAAAJ0Uk5T/wDltzBKAAAAEklEQVR42mJgYAQCBopJgAADAAbwADHy2qHzAAAAAElFTkSuQmCC);background-position:left top;background-repeat:no-repeat;padding-top:15px;position:absolute;height:15px;left:0px;display:block;font-weight:bold;font-size:12px;line-height:20px;text-transform:uppercase;text-align:left;text-indent:0px;white-space:nowrap;color:#333333;margin-left:0px;margin-right:0px;margin-top:1px;z-index:5;}.vmm-timeline .navigation .timenav .time .time-interval-major div strong{font-weight:bold;color:#000000;} +.vmm-timeline{font-size:15px;font-weight:normal;line-height:20px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;}.vmm-timeline p{font-size:15px;font-weight:normal;line-height:20px;margin-bottom:20px;color:#666666;}.vmm-timeline p small{font-size:12px;line-height:17px;} +.vmm-timeline p:first-child{margin-top:20px;} +.vmm-timeline .navigation p{color:#999999;} +.vmm-timeline .feature h3,.vmm-timeline .feature h4,.vmm-timeline .feature h5,.vmm-timeline .feature h6{margin-bottom:15px;} +.vmm-timeline .feature p{color:#666666;} +.vmm-timeline .date a,.vmm-timeline .title a{color:#999999;} +.vmm-timeline .hyphenate{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-wrap:break-word;} +.vmm-timeline h1,.vmm-timeline h2,.vmm-timeline h3,.vmm-timeline h4,.vmm-timeline h5,.vmm-timeline h6{font-weight:normal;color:#000000;text-transform:none;}.vmm-timeline h1 a,.vmm-timeline h2 a,.vmm-timeline h3 a,.vmm-timeline h4 a,.vmm-timeline h5 a,.vmm-timeline h6 a{color:#999999;} +.vmm-timeline h1 small,.vmm-timeline h2 small,.vmm-timeline h3 small,.vmm-timeline h4 small,.vmm-timeline h5 small,.vmm-timeline h6 small{color:#999999;} +.vmm-timeline h1.date,.vmm-timeline h2.date,.vmm-timeline h3.date,.vmm-timeline h4.date,.vmm-timeline h5.date,.vmm-timeline h6.date{font-weight:bold;} +.vmm-timeline h2.start{font-size:36px;line-height:38px;margin-bottom:15px;} +.vmm-timeline h1{margin-bottom:15px;font-size:32px;line-height:34px;}.vmm-timeline h1 small{font-size:18px;} +.vmm-timeline h2{margin-bottom:15px;font-size:28px;line-height:30px;}.vmm-timeline h2 small{font-size:14px;line-height:16px;} +.vmm-timeline h2.date{font-size:16px;line-height:18px;margin-bottom:3.75px;color:#999999;} +.vmm-timeline h3,.vmm-timeline h4,.vmm-timeline h5,.vmm-timeline h6{line-height:40px;}.vmm-timeline h3 .active,.vmm-timeline h4 .active,.vmm-timeline h5 .active,.vmm-timeline h6 .active{color:#0088cc;} +.vmm-timeline h3{font-size:28px;line-height:30px;}.vmm-timeline h3 small{font-size:14px;} +.vmm-timeline h4{font-size:16px;line-height:18px;}.vmm-timeline h4 small{font-size:12px;} +.vmm-timeline h5{font-size:14px;line-height:16px;} +.vmm-timeline h6{font-size:13px;line-height:14px;text-transform:uppercase;} +.vmm-timeline strong{font-weight:bold;} +.vmm-timeline Q{quotes:'„' '“';font-style:italic;} +.vmm-timeline blockquote{font-size:28px;text-align:left;line-height:36px;margin-bottom:6px;padding-top:10px;background-color:#ffffff;color:#000000;} +.vmm-timeline .credit{color:#999999;text-align:right;font-size:10px;line-height:10px;display:block;margin:0 auto;clear:both;} +.vmm-timeline .caption{text-align:left;margin-top:5px;color:#666666;font-size:11px;line-height:14px;clear:both;} +.tooltip{position:absolute;z-index:205;display:block;visibility:visible;padding:5px;opacity:0;filter:alpha(opacity=0);font-size:15px;font-weight:bold;line-height:20px;font-size:12px;line-height:12px;} +.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +@media only screen and (max-width:480px),only screen and (max-device-width:480px){}@media (max-width:600px){.slider .slider-item .content .content-container{display:block;}.slider .slider-item .content .content-container .text{width:100%;max-width:100%;min-width:120px;display:block;}.slider .slider-item .content .content-container .text .container{display:block;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-wrap:break-word;} .slider .slider-item .content .content-container .media{width:100%;min-width:50%;float:none;}.slider .slider-item .content .content-container .media .media-wrapper{margin-left:0px;margin-right:0px;width:100%;display:block;} .slider .slider-item .content .content-container .media.text-media .media-wrapper .media-container{border:none;background-color:#ffffff;}} diff --git a/vendor/timeline/20120520/css/timeline.png b/vendor/timeline/20120520/css/timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e3c489ad215cb1f74aceffdba641aa9d5abc8f GIT binary patch literal 9370 zcmb7KRahKNvu0tj;1-<42@ouJ(1k@7mf#lL3GVKYK!Puj5Foe&*x>H&51{K14i9h{G6trDDPpO>4f{VyetHUd|Vh1*-btuGFa4vy+=#xg`THMF&@uyRu; zs%^$|swlVA&g<$|{PssE^e>0EA(;Bzkl8=tW4_e$H1x&k`Lry8$u(+|>57cE1>%eO z)ebj`3vwFdP!^6yE~s2+mCMn@%<0pv@jJp9)-A1j?_R%jn6T9#%{fqNM;R|P;Y{(u)C<$}y!9-qv39j)1 zljT_rF^v08R>QTRX{fxk;yfs z;=`+=Lyk=8!O%SlP0z;sR>+Z9oEw1_e4e?}%9tG)X#+7gYcSl5cM)-Zlszd9lFs^4 zQ=AWg-`LOJ!khX7HyOuneecCoCj;RtQ@4KEERPZ?CSL&n=iL4!&3b*p3a+ym1lAR& zuln00p{SR9!4Cmbwf1wRTRT6KH}{p`Kb^dicCNZn6K_#jE_uv1&r?QmLJ!87?~UTC zwMK~oXB`!gm7?dMoGIK67wlMem=VuU<7ilyDO{yv+*z zhB%nYKU&6T-rjfx)s6I=FL+R|YUDdPrF!9cj8}}a_{aBWKtX^#C+O0taPxfX5%Zll z-7hU9xmX?F*al5Nl2z6l(LLG{qgy)_%{^`?v;&+w5*AYblVEo&bcIOKr!b!#ZaP)2 zsMLX{NCp8U*4YS-HO$*a=Chat@|n)jY^#x_P5bz+=SAJrbv%a4U06w84+YV(cqUED z#NQ%LF~%gTYPHx`d(?wKiF~hyj7z-szcG(iRR?6l3WuO$ zH8P_a`!k8mfsn78#*roc%1z9h0bmaW1ATH1{do$`T}S9WVuL$r)EMp{oX;<_*`47M zk>VM5AU3n!^f@A+r)z|8aqj{wI%^GIN%r+hAJjWbj>HV$mnuH|R$CEMz-0(6F)q?))Xn&Bw3P z7$7Egu!QrM^0nNs+qxwb#3u5Embuj-(8n#8$izQaaezE+Qx;zdV4RuPF#!2D^w->EsD^Qoa_-Puq96$eq)V!l(k6S0yYnN~D zl~;L)>xP}uxMwbc#dGOeWG)0Vzg>ROk?cd0oQg-6r1=pe9EDXgyV6zumq{L#^;25F z#BwhREW@7+LozOb{CXHM4p_*wTjMt$L(4=N@8Xxf=)|#I#3=f6?vXGGEs>KcT~Zhx zPpZ=IOHV!xKX|mUtt~MVs;?1E5AlAM82lWIe;eLLe(kTA#&oXx$M@FAGd<)O?h&02 z)^LuQegvOM34g}Z8Y}Q=Pyi}>wogPj9y`l%xv5#JB|$;GZwe6Fxf^i1;#$l)Wlx+%R0lDUV2x?FphHY z@I{}>oj3!rlf@IK8x~82buaJF^ceGkM|U(ZhWNA*9+!t5_QGq)dg+dRUHil`M^!%V zG~-Pm9f@Xbq@A$ISHUC8lj1;C6-xS)XDVzQ?5aP%kb=JT&SDN+Jjb>(O;~*sY$0Z# zA~@{k;hdw#rG6cYN)?#8TUeh)mJMxVx-}&va?(91l9-*Q(RwX2#FOaN^a@;kF}eRC z!(00S#$tsFbF!I{c$IVK`}yMK0gLB!T9e+@Wp2cN{4SI^fUa;@>hy{+3G%i}w z^xnR+D|_VYCb;;k@bWA!ST${1WY$fPX$#M;qv!Se7N22HYl^1BLyP41k@-h-cBNdv z>n& zEm)N8Uw_lL!1-WwOBH#`#~Ie6HVaBCE=UZ{`W@5`nh_kAe)v*?-5pS+3^Pjjlb+@z zn0ZJZG$}j79N|upW&hmZc{T=&6b)O}UsOE%J>)BA=2UUJeiBa$8f%}eWZV2YuZiXi zd!sDE4QAZHUqR4RWAF!8#9%6D`ba)fr9v%sCiBOf>P74Fy5Cy)ovHN0U)&=yjM6p! zz@j_JA1LE8ZAe#>3-1H%`H;*0+684_JSHK{KwJI>c<$#dcqZQo&-7HrV#m7@aRf`C`_avj?GH{oIU4xRp#$I+QHM1i zg^$nkD-%i6{zXj^227oqW-R0g(DGK{zt`Wm3Ip;D6BrYpWJ)hB$D^HFLsF#~(Tewj z4qskV7Y8)>-}B&H1F=)T7XcAH6Doo|BI6Md=8qN8N=L2)K^$(XzCX%~**p7G+z#CL z!vexsvCQxJ6--Zttk5kGcPBM|fF2?ujLa+-dXrR{n>mc@z1pMVCmJQUhQ_`BteOz= z@jNMl@3g~e=9x$3vD^1ZC|)bgo>7K%@n7+BGO9iMlCQ?PbDJarU_#FkAfNm82uHE5 z#`m)qH36W4f`W?P71I`N?zJwDod(wpjvCycf{NO%ZZy`EvwR1qp$&T0!}%Mc-Te8p z7~#p_=z(uWYx@wxX!n}A(+Zm7%G4We{j6}BYUZs*i$WHCkaUX)sC?#W8LiIYVIv|^8{=KpKF1_-;Q<;^|x>UlemmfrxjQh6Y`oSG^ zwm*V#eVyy4Jkq9RJsNQ!M|-4mlW#9>Un_`OGn%_~*OfqdJV;}q^!hMRe}B=(jam;} z_>YeliDT~(19SBv^gV3Ysr0W<1>OJ;6fAVh$qwY0eq&LnYuuss&W4kYdZV{Q9<{Ec@WfwOf*>U6d7#w%h)kh1Xk-;^^yE8|u=OFjyX{&`qqLKfQX ze*`}iD|hUFC9#^Z4U8uIWlnETOwf~oe2^KW_wvQ zHN>$nYUZ8Fy-n#{d^ykec7v|adSo-5<=8^>L15pIu%D4(LF07v4?;FZv-xRc@$gdbXFjd~#a$dJ@P zbaDa20?Oh6ot<6Bjh%}`v%;Cwn+eCqH=CE!XYE4`{m2HH3r~FwNnL55h{X)2dnv=Q zEsDfj2(2%!@n?_1jAP6vtbiN>B%A6>*-@sH`1IG>`>NgPvfIj9klAcuPbrn!3=_j^@X+pJ6KJM(mMQlsaH)}iIAu7To>(j*SN4EidOfu7{>eF(o^2#NBVDfs6U zWTl(Ilh5&5WaEc*s23&k`OzT5?M`3%Na(zIl=Dd?wn^O%W@5EUnEP1i=@e`;!Qw)2 z1py95x2X}f#%xR7k$4~WX?Fl~x3xvQfvRR2%-lrO7hM#ZNikb124!oCNTbIxH|nZi zHm{9zW0;_gh>(h)PLDQuJ>WT!D@VUd8$by@3vVG!HDA;78E`eghPNfuSIElGJzu1 zhR#K&LosHGkK^CTv$K8AX+MATJqG+P38E@jl_>Pef>W5x6@6X2NQ%mS2fv__2Kjz4 z`KYo=N7HY?qpzTBTj4-sRy|J_9#-_1*aOYI2np>pAdD3KTBo@1nMSwUQS5t|_jBS0 z?`E$~_VbEw_`K8{ov3K1a&>!)hwW1YZvysch! z1uBw7*H$Hie?Pa33m$9EkDxX}SN4f`?8sR<@EG4vbFzrPIF}@*tfnyuvaR6PO2W^L z)E+m1iXd<%_%SPCvA@`GV)QY`wewy!zBy(WSn&$YwFp4fIlKapIQ1<{At9o-vEK#j z@PyH?I-z#J_>W9xEUPmzZS>g%CBV@GSY3+tc9<@UZ_lK-0 zBm8Nn+Z}+)-rx(QHZD#A&j>@5Xw%~UGmHUv1mD_oa2r`;92?J2JhICa9St%h zLx@~YGbwQWC$@s!I*p&vhR#V%uhL)jT93LNkJ2t~^(3^EZi#<* z?-3c^puhKxTGplieS-DpQX+yu_eTLBF3HcoYrW(M)of z#AU?9M~uwk!;D+pN-e{NgL9}D5NRcw4rT_PI8ei_I+Q7vT=+SfLpl0|m_hBBNQe0P z;$1e;a#%scUpXhMncE_Z^aDD$x4q&@Ia8V78`)No2(8!CU`;^VPm_1Q#(1gkIDSOl zapkrU%Sfu7{jgY~n$!_1z1X)nCgiJEAU^2`MJum+bdowu#;b!CT4YGJQA&qUt*qNi@L;*I{9>4Wx&q&9C) zJ1Jt0Lgb8Vx2?0pLbsubKwf}plbs2}f(hj~oA*1R^qy0j3Ye-jfuh4Z3?({V=$b~#f zo2f61{uv;!Oo?U>LGnkbo8nvFUvpf`Z)nIFb3$HLn~sZUaI&f<&2J78y%2Ri4hkvL zKzXj4)2?*1YV@MPz+PBCCO<2{aF?!3bsX%d(v#rlJY31^PgF|L z&fYFHb!(UGvAFw)rY<}_>?a-;ate?FZ?+$BMDedj`QeO2B$1Q7-3w%R%Wf_0>7MFC z#L}!`X^|T#LGN9h$JToj@isk*!SNPeBRYcb@?+6RDm!)t7xnRAP=|*NB%Ui#bchg# zJ$wCjQx(b>Ma8S0C1~1GQv^w@cFo|d^$P`(;)bDdtE?h0&d9bieSQZD_FP#tdoT=-)YDXzA=F$Ehv!?9?e>YC? zdR>z`_J!&x(aenCVgEg)TtdskjofykoFqAUBsb#qwd(*1uHD?bir7gsXQJ&*UJI>7 z%RH@G%xQ^u(?jU7!k%>TQt1^tfM8VCsIG8hLLj(983kZjQH6$4*+l95Lj-~1=JcT- zJfJ!fBa7mOcolOJ+sPvsCm}Q0))&qFAqDydUc;M(wy#9d@HrG-CzyGua4s4{E$n1G z(k4|)fN{O~sCr0Jzp42WpsC659Wdul-!#X}(r0ZQ3p&iBq(d8~G240<%wmS%Mg5&_ zI9JR^Ueq{?OKu8`P_&UBgja#`-+12ILTX1A zB7v}{cgljr39O{q1jdjzV7T(~c6OVboJq1&AI1vf;Hq!F-VcUV8`Cm0N86=$S}n#` zVo~JZN{0jl9%Lm15WztFXqD5%jPnevJ?BI->%w;-2h|p^jJTf{iT8Fj@dH;HNSQ^2 zp;9XTs6AbNKu#^=i_E~B z-U6?SA%r%s--Bf}d~|{HjWc02HC9#p!6H;w8oDf56`XsKg8@@RV?}v+9x>pE^=4YF zc6oW4nXkjg>-TA)wT}upeTiWK@h`K`s#ztCivF&L7%Rk^BoCGBl_F6r@|^|a$w7F< z$)6lM4d^Fw4>4WK2O(Q{!s9Tr)Y(N2`9H3Wu`)+#9MKsa1Ld1o%_20ud92YKr5 zz9C>=?PQY_q>kXa=4X$*Q&$SAxID@LQ+MRMC>Y*iG1yE>J{2~Auq&S_#%=_!iJ+l4 zp_%;_I@J9*;dT8^LNEldU{GB~B{ZA27tKGF{Os$C3@M+*0TIUQ;OybAD3K=h7 zjJal+$?Co{v9gqlb$XhoE^HY?%J z$*`}j7bIUF`o@i}0KwBHG3v3^0tq@#NmS8wV-yk9?-~650C7gp!un|mbT0Zoe#dJF z%4!z^c|CWn^sAn44HcpmH!Atex`DMzBuJs8wjaZS^AG#4BJB~(4z)<$9%k& zf^KeuHdFwag@gTKebH~Wn@t(U00G{QWsm71G$h;>Sf>2SA1}?IMzK2#>gE5&AGE_v z+M8<1@pyIaCX<=3ix5cR&UpUOmc`^6zcU88k_jTvNM6qeoXNACpjnm>5u`GEK zgk}FvG%~N<#BTW>#U}1; z7Od2T59ZrczpuG@jZ@_t>^md9^#g4|v9bqCk{f-oIF6t0zf5=((ch zFpBLtl0u)_1)tX*A>AtM99JG*=%Yi4_(FgbuTPr~FM0Unwa+43|DqKV-7X zIg~|ZebxKBH+nRc&te45qMSK{nf#Bnw$h*$BQfLSUkOd|?>Esc?pAs)T%EIObL(|= zbkaJ*F>j3&!xXLkzJI?8nva)i6LJ0BQ@OBJVp>WnxHk1Ev~ZPr+;}&BvR;iJLh54j z<&U!iUsrH>apREdvNO$9ddg?(SxLq+`C9?h^@kb-IrM>g?ahN zrUMAiuBN12eJ1?(CM(vH6oG@ft^5SNl};VDw!kN^n}*T06sX)ANSTaj*#7_%=ByF` literal 0 HcmV?d00001 diff --git a/vendor/timeline/20120520/js/timeline.js b/vendor/timeline/20120520/js/timeline.js new file mode 100644 index 00000000..91a8e86f --- /dev/null +++ b/vendor/timeline/20120520/js/timeline.js @@ -0,0 +1,7637 @@ +/*! + 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: [] + }, + + 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; + var _tag = "
"; + var _class = ""; + var _content = ""; + + + 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(); + } + }, + + animate: function(element, duration, ease, att, callback_function) { + + var _ease = "easein"; + var _duration = 1000; + var _att = {}; + + if (duration != null) { + if (duration < 1) { + _duration = 1; + } else { + _duration = Math.round(duration); + } + + } + + if (ease != null && ease != "") { + _ease = ease; + } + + 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 + var __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:false, duration:_duration, easing:_ease, complete:callback_function} ); + } else { + jQuery(element).animate(_att, {queue:false, 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
"; + mediaElem = "
"; + return mediaElem; + } else if (m.type == "flickr") { + 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 == "wikipedia") { + mediaElem = "
"; + return mediaElem; + } else if (m.type == "unknown") { + if (m.id.match("blockquote")) { + mediaElem = "
"; + } else { + mediaElem = "
"; + } + return mediaElem; + } else if (m.type == "website") { + mediaElem = "
"; + //mediaElem = "
"; + return mediaElem; + } else { + mediaElem = "
"; + return mediaElem; + } + } + }, + + create: function(data) { + //$mediacontainer = element; + var _valid = false; + + if (data.media != null && data.media != "") { + var mediaElem = ""; + var captionElem = ""; + var creditElem = ""; + var m = VMM.MediaType(data.media); //returns an object with .type and .id + var isTextMedia = false; + var _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); + // GOOGLE DOCS + } else if (m.type == "googledoc") { + _id = "googledoc_" + VMM.Util.unique_ID(5); + mediaElem = "

Loading Document

"; + VMM.ExternalAPI.googledocs.get(m.id, _id); + // YOUTUBE + } else if (m.type == "youtube") { + mediaElem = "

Loading YouTube video

"; + 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); + // 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 == "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 + "
"; + } + + /* + if (_return) { + if (isTextMedia) { + return "
" + mediaElem + "
"; + } else { + return "
" + mediaElem + "
"; + } + } else { + VMM.appendElement($mediacontainer, mediaElem); + VMM.appendElement($mediacontainer, creditElem); + VMM.appendElement($mediacontainer, captionElem); + } + */ + }; + + }, + + }).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 { + 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')) { + 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("flickr.com/photos")) { + media.type = "flickr"; + media.id = d.split("photos\/")[1].split("/")[1]; + media.link = d; + success = true; + } else if (d.match(/jpg|jpeg|png|gif/i) || d.match("staticmap")) { + 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 = VMM.Util.toTitleCase(wiki_id).replace(" ", "%20"); + success = true; + } else if (d.indexOf('http://') == 0) { + media.type = "website"; + 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, ""; + } 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; + } + + }, + + 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) { + var api_obj = {url: url, id: id}; + VMM.master_config.wikipedia.que.push(api_obj); + VMM.master_config.wikipedia.active = true; + }, + + create: function(api_obj) { + var the_url = "http://en.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 += "
From Wikipedia, the free encyclopedia"; + 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 = VMM.Util.getObjectAttributeByIndex(d.query.pages, 0).extract; + var wiki_title = VMM.Util.getObjectAttributeByIndex(d.query.pages, 0).title; + var _wiki = ""; + var wiki_text = ""; + var wiki_text_array = wiki_extract.split("

"); + var wiki_number_of_paragraphs = 1; + + 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) { + trace(d.data.id); + trace(d.data.thumbnail.sqDefault); + 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.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 { + timer = setTimeout(preloadTimeOutSlides, config.duration); + } + } + + var preloadTimeOutSlides = function() { + for(var j = 0; j < config.preload; j++) { + if ( !((current_slide + j) > slides.length - 1)) { + slides[current_slide + j].show(); + } + if ( !( (current_slide - j) < 0 ) ) { + slides[current_slide - j].show(); + } + } + + sizeSlides(); + } + + /* 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); + + // 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 + ".twitter .avatar img", "max-width", 32 ); + VMM.Lib.css( layout_text_media + ".twitter .avatar img", "max-height", 32 ); + VMM.Lib.css( layout_media + ".twitter .avatar img", "max-width", 32 ); + VMM.Lib.css( layout_media + ".twitter .avatar img", "max-height", 32 ); + + // 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); + + // 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, data[current_slide - 1].startdate_str); + 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, data[current_slide + 1].startdate_str); + 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(element, data) + VMM.Slider.Slide = function(d, _parent) { + + var data = d; + var slide = {}; + var media = ""; + var loaded = false; + var preloaded = false; + var is_skinny = false; + var element = VMM.appendAndGetElement(_parent, "
", "slider-item"); + var c = {slide:"", text: "", media: "", media_element: "", layout: "content-container layout", has: { headline: false, text: false, media: false }}; + var $media, $text, $slide, $wrap; + /* PUBLIC + ================================================== */ + this.show = function(skinny) { + if (!loaded) { + if (preloaded) { + reLayout(skinny); + } else { + render(skinny); + } + } + }; + + this.hide = function() { + if (loaded) { + removeSlide(); + } + }; + + 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) { + buildSlide(skinny); + loaded = true; + preloaded = true; + var timer = setTimeout(VMM.ExternalAPI.pushQues, 500); + }; + + var removeSlide = function() { + //VMM.attachElement(element, ""); + loaded = false; + } + + var reLayout = function(skinny) { + + if (c.has.text) { + if (skinny) { + if (!is_skinny) { + VMM.Lib.removeClass($slide, "pad-left"); + VMM.Lib.detach($text); + VMM.Lib.prepend($slide, $text); + is_skinny = true; + } + } else { + if (is_skinny) { + VMM.Lib.addClass($slide, "pad-left"); + VMM.Lib.detach($text); + VMM.Lib.append($slide, $text); + is_skinny = false + } + } + } + } + + var buildSlide = function(skinny) { + $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 = data.startdate_str; + var en = data.enddate_str; + 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); + } + + /* 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 (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.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); + } + } + }, + + date: { + + 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''", + }, + + 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.Util.date.dateformats = lang.dateformats; + VMM.Util.date.month = lang.date.month; + VMM.Util.date.month_abbr = lang.date.month_abbr; + VMM.Util.date.day = lang.date.day; + VMM.Util.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 { + try { + var out = new Date(d); + if (isNaN(out) === false) { + return out; + } + } catch (e) { + } + var _date = new Date(0, 0, 1, 0, 0, 0, 0); + var _d_array; // DATE ARRAY + var _t_array; // TIME ARRAY + 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("/")) { + var _time_parse; + var _times; + 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 { + _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.Util.date.dateformats.year; + } else if (d.getDate() <= 1 && d.getHours() === 0 && d.getMinutes() === 0) { + // YEAR MONTH + if (is_abbr) { + format = VMM.Util.date.dateformats.month_short; + } else { + format = VMM.Util.date.dateformats.month; + } + } else if (d.getHours() === 0 && d.getMinutes() === 0) { + // YEAR MONTH DAY + if (is_abbr) { + format = VMM.Util.date.dateformats.full_short; + } else { + format = VMM.Util.date.dateformats.full; + } + } else if (d.getMinutes() === 0) { + // YEAR MONTH DAY HOUR + if (is_abbr) { + format = VMM.Util.date.dateformats.time_no_seconds_short; + } else { + format = VMM.Util.date.dateformats.time_no_seconds_small_date; + } + } else { + // YEAR MONTH DAY HOUR MINUTE + if (is_abbr){ + format = VMM.Util.date.dateformats.time_no_seconds_short; + } else { + format = VMM.Util.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; + } + } + + }, + + // VMM.Util.doubledigit(number). + 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 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; + }, + + /* 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(); + + //'string'.linkify(); + if(!String.linkify) { + String.prototype.linkify = function() { + + // http://, https://, ftp:// + var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim; + + // www. sans http:// or https:// + var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim; + + // Email addresses + var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim; + + var twitterHandlePattern = /(@([\w]+))/g; + + var twitterSearchPattern = /(#([\w]+))/g; + + return this + .replace(urlPattern, '$&') + .replace(pseudoUrlPattern, '$1$2') + .replace(emailAddressPattern, '$1') + .replace(twitterHandlePattern, "$1") + .replace(twitterSearchPattern, "$1"); + }; + }; + //str.substr(3,4) + /* + * 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)) throw SyntaxError("invalid date"); + + 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.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.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" + } + } +}; + +/*********************************************** + 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 "VMM.js"; +// @codekit-prepend "VMM.Library.js"; +// @codekit-prepend "VMM.Browser.js"; +// @codekit-prepend "VMM.MediaElement.js"; +// @codekit-prepend "VMM.MediaType.js"; +// @codekit-prepend "VMM.Media.js"; +// @codekit-prepend "VMM.FileExtention.js"; +// @codekit-prepend "VMM.ExternalAPI.js"; +// @codekit-prepend "VMM.TouchSlider.js"; +// @codekit-prepend "VMM.DragSlider.js"; +// @codekit-prepend "VMM.Slider.js"; +// @codekit-prepend "VMM.Slider.Slide.js"; +// @codekit-prepend "VMM.Util.js"; +// @codekit-prepend "VMM.LoadLib.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.35"; + + 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, + 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.Util.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 = _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() { + + updateSize(); + _dates = []; + VMM.fireEvent(global, config.events.messege, "Building Dates"); + 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.Util.date.parse(data.date[i].startDate); + } + + _date.uniqueid = (data.date[i].startDate).toString() + "-" + i.toString(); + + // 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.Util.date.parse(data.date[i].endDate); + } + } else { + _date.enddate = _date.startdate; + } + + _date.title = data.date[i].headline; + _date.headline = data.date[i].headline; + _date.type = data.date[i].type; + _date.date = VMM.Util.date.prettyDate(_date.startdate); + _date.startdate_str = VMM.Util.date.prettyDate(_date.startdate); + _date.enddate_str = VMM.Util.date.prettyDate(_date.enddate); + _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; + + + _dates.push(_date); + + } + + }; + + /* CUSTOM SORT + ================================================== */ + _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 = {}; + var td_num = 0; + var 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(5); + _date.enddate = _date.startdate; + _date.title = data.headline; + _date.headline = data.headline; + _date.text = data.text; + _date.type = "start"; + _date.date = VMM.Util.date.prettyDate(data.startDate); + _date.asset = data.asset; + _date.fulldate = _date.startdate.getTime(); + + if (config.embed) { + VMM.fireEvent(global, config.events.headline, _date.headline); + } + + _dates.push(_date); + } + + /* CUSTOM SORT + ================================================== */ + _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 data = [], era_markers = [], markers = [], interval_array = [], interval_major_array = [], eras, content, tags = []; + + 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(interval_array, true, true); + positionInterval(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) { + + current_marker = n; + var _ease = config.ease; + var _duration = config.duration; + var is_last = false; + var is_first = false; + var _pos = VMM.Lib.position(markers[current_marker].marker); + + 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": (config.width/2) - (_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; + var pos = 0; + var pos_dif = 0; + var mp_diff = []; + + for(var i = 0; i < markers.length; i++) { + if (data[i].type == "start") { + + } else { + var _pos = positionOnTimeline(interval, data[i].startdate, data[i].enddate); + 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 positionOnTimeline = function(the_interval, first, last) { + + var _type = the_interval.type; + var _multiplier = the_interval.multiplier; + + var _first = getDateFractions(first); + var _last; + + var tsd; + var ted; + /* CALCULATE POSITION ON TIMELINE + ================================================== */ + tsd = first.months; + + if (type.of(last) == "date") { + + /* LAST + ================================================== */ + _last = getDateFractions(last); + ted = last.months; + + if (_type == "eon") { + tsd = _first.eons; + ted = _last.eons; + } else if (_type == "era") { + tsd = _first.eras; + ted = _last.eras; + } else if (_type == "epoch") { + tsd = _first.epochs; + ted = _last.epochs; + } else if (_type == "age") { + tsd = _first.ages; + ted = _last.ages; + } else if (_type == "millenium") { + tsd = first.milleniums; + ted = last.milleniums; + } else if (_type == "century") { + tsd = _first.centuries; + ted = _last.centuries; + } else if (_type == "decade") { + tsd = _first.decades; + ted = _last.decades; + } else if (_type == "year") { + tsd = _first.years; + ted = _last.years; + } else if (_type == "month") { + tsd = _first.months; + ted = _last.months; + } else if (_type == "week") { + tsd = _first.weeks; + ted = _last.weeks; + } else if (_type == "day") { + tsd = _first.days; + ted = _last.days; + } else if (_type == "hour") { + tsd = _first.hours; + ted = _last.hours; + } else if (_type == "minute") { + tsd = _first.minutes; + ted = _last.minutes; + } + + _pos = ( tsd - interval.base ) * (config.nav.interval_width / config.nav.multiplier.current); + _pos_end = ( ted - interval.base ) * (config.nav.interval_width / config.nav.multiplier.current); + + } else { + if (_type == "eon") { + tsd = _first.eons; + ted = _first.eons; + } else if (_type == "era") { + tsd = _first.eras; + ted = _first.eras; + } else if (_type == "epoch") { + tsd = _first.epochs; + ted = _first.epochs; + } else if (_type == "age") { + tsd = _first.ages; + ted = _first.ages; + } else if (_type == "millenium") { + tsd = first.milleniums; + ted = first.milleniums; + } else if (_type == "century") { + tsd = _first.centuries; + ted = _first.centuries; + } else if (_type == "decade") { + tsd = _first.decades; + ted = _first.decades; + } else if (_type == "year") { + tsd = _first.years; + ted = _first.years; + } else if (_type == "month") { + tsd = _first.months; + ted = _first.months; + } else if (_type == "week") { + tsd = _first.weeks; + ted = _first.weeks; + } else if (_type == "day") { + tsd = _first.days; + ted = _first.days; + } else if (_type == "hour") { + tsd = _first.hours; + ted = _first.hours; + } else if (_type == "minute") { + tsd = _first.minutes; + ted = _first.minutes; + } + + _pos = ( tsd - interval.base ) * (config.nav.interval_width / config.nav.multiplier.current); + _pos_end = _pos; + + } + + return pos = {begin:_pos ,end:_pos_end}; + + } + + var positionMarkers = function(is_animated) { + + var _type = interval.type; + var _multiplier = interval.multiplier; + + // ROWS + var row = 2; //row + var lpos = 0; // last marker pos; + var row_depth = 0; + var _line_last_height_pos = 150; + var _line_height = 6; + var cur_mark = 0; + + 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; // EVENT LENGTH + var _marker = markers[i].marker; + var _marker_flag = markers[i].flag; + var _marker_line_event = markers[i].lineevent; + var _pos = positionOnTimeline(interval, data[i].startdate, data[i].enddate); + var _pos_offset = -2; + + 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); + + // 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.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) { + VMM.Lib.stop(_marker_flag); + VMM.Lib.animate(_marker_flag, config.duration, config.ease, {"top": config.nav.rows[row]}); + } else { + 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); + } + + } + + for(var j = 0; j < era_markers.length; j++) { + var _line; + var era = era_markers[j]; + var era_elem = era.content; + var pos = positionOnTimeline(interval, era.startdate, era.enddate); + var era_length = pos.end - pos.begin; + var 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)}); + + + } + + var positionInterval = function(the_intervals, is_animated, is_minor) { + + var _type = interval.type; + var _multiplier = interval.multiplier; + var last_position = 0; + var last_position_major = 0; + + for(var i = 0; i < the_intervals.length; i++) { + var _interval = the_intervals[i].interval_element; + var _interval_date = the_intervals[i].interval_date; + var _interval_visible = the_intervals[i].interval_visible; + var _pos = positionOnTimeline(interval, _interval_date); + var pos = _pos.begin; + var is_visible = true; + var pos_offset = 50; + + // APPLY POSITION TO MARKER + if (is_animated) { + VMM.Lib.animate(_interval, config.duration/2, config.ease, {"left": pos}); + } else { + VMM.Lib.css(_interval, "left", pos); + } + + // 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 (_interval_visible) { + if (!is_visible) { + if (is_animated) { + VMM.Lib.animate(_interval, config.duration*2, config.ease, {"opacity": 0}); + } else { + VMM.Lib.css(_interval, "opacity", 0); + } + the_intervals[i].interval_visible = false; + } + } else { + if (is_visible) { + if (is_animated) { + VMM.Lib.animate(_interval, config.duration*2, config.ease, {"opacity": 100}); + } else { + VMM.Lib.css(_interval, "opacity", 100); + } + the_intervals[i].interval_visible = true; + } + } + + last_position = pos; + + if (pos > config.nav.minor_width) { + config.nav.minor_width = pos; + } + + } + + VMM.Lib.css($timeintervalminor_minor, "left", -(config.width/2)); + VMM.Lib.width($timeintervalminor_minor, (config.nav.minor_width)+(config.width) ); + } + + var createIntervalElements = function(_interval, _array, _element_parent) { + + var inc_time = 0; + var _first_run = true; + var _last_pos = 0; + var _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; + var _pos; + var pos; + var _element = VMM.appendAndGetElement(_element_parent, "
", _interval.classname); + var _date; + var _visible = false; + + 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.Util.date.prettyDate(_interval.date, true); + + inc_time = 1; + + _first_run = false; + + _pos = positionOnTimeline(_interval, _interval.date); + pos = _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 + }; + + _array.push(_obj); + } + + VMM.Lib.width($timeintervalminor_minor, _largest_pos); + + positionInterval(_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(interval_array, false, true); + positionInterval(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; //row + var lpos = 0; // last marker pos; + var 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 = 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"); + + + // THUMBNAIL + if (data[i].asset != null && data[i].asset != "") { + VMM.appendElement(_marker_content, VMM.MediaElement.thumbnail(data[i].asset, 24, 24)); + } else { + //VMM.appendElement(_marker_content, "
"); + VMM.appendElement(_marker_content, "
"); + } + + // ADD DATE AND TITLE + VMM.appendElement(_marker_content, "

" + VMM.Util.unlinkify(data[i].title) + "

" + data[i].date + "

"); + + // ADD ID + VMM.Lib.attr(_marker, "id", (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", + 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].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 + }; + + 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; + + 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") ) { + VMM.fireEvent(global, VMM.Timeline.Config.events.messege, VMM.Timeline.Config.language.messages.loading_timeline); + trace("DATA SOURCE: GOOGLE SPREADSHEET"); + VMM.Timeline.DataObj.model_GoogleSpreadsheet.getData(raw_data); + + } else { + VMM.fireEvent(global, VMM.Timeline.Config.events.messege, VMM.Timeline.Config.language.messages.loading_timeline); + trace("DATA SOURCE: JSON"); + trace("raw data" + raw_data); + 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_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); + } + }, + + model_GoogleSpreadsheet: { + // TEMPLATE CAN BE FOUND HERE + // https://docs.google.com/previewtemplate?id=0AppSVxABhnltdEhzQjQ4MlpOaldjTmZLclQxQWFTOUE&mode=public + type: "google spreadsheet", + + + getData: function(raw_data) { + + var _key = VMM.Util.getUrlVars(raw_data)["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 (dd.gsx$tag.$t) { + _date.tag = dd.gsx$tag.$t; + trace("TAG " + _date.tag); + } + _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"} + + }; + +} From 1394b9affa6969b974c90336dd0c62dffd5ee29b Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Tue, 22 May 2012 17:01:39 +0100 Subject: [PATCH 2/3] [#73,app][s]: integrate timeline into multiview and app. --- app/index.html | 3 +++ app/style/demo.css | 4 ++++ src/view.js | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/app/index.html b/app/index.html index 08d17ff4..6d9d78c2 100644 --- a/app/index.html +++ b/app/index.html @@ -15,6 +15,7 @@ + @@ -37,6 +38,7 @@ + diff --git a/app/style/demo.css b/app/style/demo.css index a9023e24..60b761ec 100644 --- a/app/style/demo.css +++ b/app/style/demo.css @@ -11,3 +11,7 @@ body { height: 550px; } +.recline-timeline .vmm-timeline { + height: 550px; +} + diff --git a/src/view.js b/src/view.js index ada96afb..3731de62 100644 --- a/src/view.js +++ b/src/view.js @@ -205,6 +205,13 @@ my.DataExplorer = Backbone.View.extend({ model: this.model, state: this.state.get('view-map') }), + }, { + id: 'timeline', + label: 'Timeline', + view: new my.Timeline({ + model: this.model, + state: this.state.get('view-timeline') + }), }]; } // these must be called after pageViews are created From b4255ef18fc9d8d0b58f51067e80b36741214b20 Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Thu, 24 May 2012 00:30:35 +0100 Subject: [PATCH 3/3] [model][s]: default string renderer will linkify http://... links. --- src/model.js | 24 +++++++++++++++++++----- test/model.test.js | 8 +++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/model.js b/src/model.js index 88c724a7..aca6c1e3 100644 --- a/src/model.js +++ b/src/model.js @@ -217,7 +217,6 @@ my.DocumentList = Backbone.Collection.extend({ // * format: (optional) used to indicate how the data should be formatted. For example: // * type=date, format=yyyy-mm-dd // * type=float, format=percentage -// * type=string, format=link (render as hyperlink) // * type=string, format=markdown (render as markdown if Showdown available) // * is_derived: (default: false) attribute indicating this field has no backend data but is just derived from other fields (see below). // @@ -236,6 +235,15 @@ my.DocumentList = Backbone.Collection.extend({ // field. This provides support for a) 'derived/computed' fields: i.e. fields // whose data are functions of the data in other fields b) transforming the // value of this field prior to rendering. +// +// #### Default renderers +// +// * string +// * no format provided: pass through but convert http:// to hyperlinks +// * format = plain: do no processing on the source text +// * format = markdown: process as markdown (if Showdown library available) +// * float +// * format = percentage: format as a percentage my.Field = Backbone.Model.extend({ // ### defaults - define default values defaults: { @@ -278,9 +286,7 @@ my.Field = Backbone.Model.extend({ }, 'string': function(val, field, doc) { var format = field.get('format'); - if (format === 'link') { - return 'VAL'.replace(/VAL/g, val); - } else if (format === 'markdown') { + if (format === 'markdown') { if (typeof Showdown !== 'undefined') { var showdown = new Showdown.converter(); out = showdown.makeHtml(val); @@ -288,8 +294,16 @@ my.Field = Backbone.Model.extend({ } else { return val; } + } else if (format == 'plain') { + return val; + } else { + // as this is the default and default type is string may get things + // here that are not actually strings + if (val && typeof val === 'string') { + val = val.replace(/(https?:\/\/[^ ]+)/g, '$1'); + } + return val } - return val; } } }); diff --git a/test/model.test.js b/test/model.test.js index f4a4c623..b7a0e3d8 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -43,6 +43,7 @@ test('Field: default renderers', function () { x: 12.3, myobject: {a: 1, b: 2}, link: 'http://abc.com/', + link2: 'Some text then https://abc.com/', markdown: '### ABC' }); var field = new recline.Model.Field({id: 'myobject', type: 'object'}); @@ -55,11 +56,16 @@ test('Field: default renderers', function () { var exp = '12.3%'; equal(out, exp); - var field = new recline.Model.Field({id: 'link', type: 'string', format: 'link'}); + var field = new recline.Model.Field({id: 'link'}); var out = doc.getFieldValue(field); var exp = 'http://abc.com/'; equal(out, exp); + var field = new recline.Model.Field({id: 'link2'}); + var out = doc.getFieldValue(field); + var exp = 'Some text then https://abc.com/'; + equal(out, exp); + var field = new recline.Model.Field({id: 'markdown', type: 'string', format: 'markdown'}); var out = doc.getFieldValue(field); // Showdown is not installed so nothing should happen