Added: 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/ext/japanese-eras.js
==============================================================================
--- 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/ext/japanese-eras.js
 (added)
+++ 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/ext/japanese-eras.js
 Wed Apr 12 14:40:22 2017
@@ -0,0 +1,395 @@
+/*==================================================
+ *  Japanese Era Date Labeller
+ *==================================================
+ */
+
+Timeline.JapaneseEraDateLabeller = function(locale, timeZone, 
useRomanizedName) {
+    var o = new Timeline.GregorianDateLabeller(locale, timeZone);
+    
+    o._useRomanizedName = (useRomanizedName);
+    o._oldLabelInterval = o.labelInterval;
+    o.labelInterval = Timeline.JapaneseEraDateLabeller._labelInterval;
+    
+    return o;
+};
+
+Timeline.JapaneseEraDateLabeller._labelInterval = function(date, intervalUnit) 
{
+    var text;
+    var emphasized = false;
+    
+    var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
+    
+    switch(intervalUnit) {
+    case Timeline.DateTime.YEAR:
+    case Timeline.DateTime.DECADE:
+    case Timeline.DateTime.CENTURY:
+    case Timeline.DateTime.MILLENNIUM:
+        var y = date2.getUTCFullYear();
+        if (y >= 
Timeline.JapaneseEraDateLabeller._eras.elementAt(0).startingYear) {
+            var eraIndex = 
Timeline.JapaneseEraDateLabeller._eras.find(function(era) {
+                    return era.startingYear - y;
+                }
+            );
+            if (eraIndex < Timeline.JapaneseEraDateLabeller._eras.length()) {
+                var era = 
Timeline.JapaneseEraDateLabeller._eras.elementAt(eraIndex);
+                if (y < era.startingYear) {
+                    era = 
Timeline.JapaneseEraDateLabeller._eras.elementAt(eraIndex - 1);
+                }
+            } else {
+                var era = 
Timeline.JapaneseEraDateLabeller._eras.elementAt(eraIndex - 1);
+            }
+            
+            text = (this._useRomanizedName ? era.romanizedName : 
era.japaneseName) + " " + (y - era.startingYear + 1);
+            emphasized = intervalUnit == Timeline.DateTime.YEAR && y == 
era.startingYear;
+            break;
+        } // else, fall through
+    default:
+        return this._oldLabelInterval(date, intervalUnit);
+    }
+    
+    return { text: text, emphasized: emphasized };
+};
+
+/*==================================================
+ *  Japanese Era Ether Painter
+ *==================================================
+ */
+ 
+Timeline.JapaneseEraEtherPainter = function(params, band, timeline) {
+    this._params = params;
+    this._theme = params.theme;
+};
+
+Timeline.JapaneseEraEtherPainter.prototype.initialize = function(band, 
timeline) {
+    this._band = band;
+    this._timeline = timeline;
+    
+    this._backgroundLayer = band.createLayerDiv(0);
+    this._backgroundLayer.setAttribute("name", "ether-background"); // for 
debugging
+    this._backgroundLayer.style.background = 
this._theme.ether.backgroundColors[band.getIndex()];
+    
+    this._markerLayer = null;
+    this._lineLayer = null;
+    
+    var align = ("align" in this._params) ? this._params.align : 
+        this._theme.ether.interval.marker[timeline.isHorizontal() ? "hAlign" : 
"vAlign"];
+    var showLine = ("showLine" in this._params) ? this._params.showLine : 
+        this._theme.ether.interval.line.show;
+        
+    this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(
+        this._timeline, this._band, this._theme, align, showLine);
+        
+    this._highlight = new Timeline.EtherHighlight(
+        this._timeline, this._band, this._theme, this._backgroundLayer);
+}
+
+Timeline.JapaneseEraEtherPainter.prototype.setHighlight = function(startDate, 
endDate) {
+    this._highlight.position(startDate, endDate);
+}
+
+Timeline.JapaneseEraEtherPainter.prototype.paint = function() {
+    if (this._markerLayer) {
+        this._band.removeLayerDiv(this._markerLayer);
+    }
+    this._markerLayer = this._band.createLayerDiv(100);
+    this._markerLayer.setAttribute("name", "ether-markers"); // for debugging
+    this._markerLayer.style.display = "none";
+    
+    if (this._lineLayer) {
+        this._band.removeLayerDiv(this._lineLayer);
+    }
+    this._lineLayer = this._band.createLayerDiv(1);
+    this._lineLayer.setAttribute("name", "ether-lines"); // for debugging
+    this._lineLayer.style.display = "none";
+    
+    var minYear = this._band.getMinDate().getUTCFullYear();
+    var maxYear = this._band.getMaxDate().getUTCFullYear();
+    var eraIndex = Timeline.JapaneseEraDateLabeller._eras.find(function(era) {
+            return era.startingYear - minYear;
+        }
+    );
+    
+    var l = Timeline.JapaneseEraDateLabeller._eras.length();
+    for (var i = eraIndex; i < l; i++) {
+        var era = Timeline.JapaneseEraDateLabeller._eras.elementAt(i);
+        if (era.startingYear > maxYear) {
+            break;
+        }
+        
+        var d = new Date(0);
+        d.setUTCFullYear(era.startingYear);
+        
+        var labeller = {
+            labelInterval: function(date, intervalUnit) {
+                return {
+                    text: era.japaneseName,
+                    emphasized: true
+                };
+            }
+        };
+        
+        this._intervalMarkerLayout.createIntervalMarker(
+            d, labeller, Timeline.DateTime.YEAR, this._markerLayer, 
this._lineLayer);
+    }
+    this._markerLayer.style.display = "block";
+    this._lineLayer.style.display = "block";
+};
+
+Timeline.JapaneseEraEtherPainter.prototype.softPaint = function() {
+};
+
+
+Timeline.JapaneseEraDateLabeller._eras = new Timeline.SortedArray(
+    function(e1, e2) {
+        return e1.startingYear - e2.startingYear;
+    },
+    [
+        { startingYear: 645, japaneseName: '大化', romanizedName: "Taika" },
+        { startingYear: 650, japaneseName: '白雉', romanizedName: "Hakuchi" 
},
+        { startingYear: 686, japaneseName: '朱鳥', romanizedName: "Shuchō" 
},
+        { startingYear: 701, japaneseName: '大宝', romanizedName: "Taihō" },
+        { startingYear: 704, japaneseName: '慶雲', romanizedName: "Keiun" },
+        { startingYear: 708, japaneseName: '和銅', romanizedName: "Wadō" },
+        { startingYear: 715, japaneseName: '霊亀', romanizedName: "Reiki" },
+        { startingYear: 717, japaneseName: '養老', romanizedName: "Yōrō" },
+        { startingYear: 724, japaneseName: '神亀', romanizedName: "Jinki" },
+        { startingYear: 729, japaneseName: '天平', romanizedName: "Tenpyō" 
},
+        { startingYear: 749, japaneseName: '天平感宝', romanizedName: 
"Tenpyō-kanpō" },
+        { startingYear: 749, japaneseName: '天平勝宝', romanizedName: 
"Tenpyō-shōhō" },
+        { startingYear: 757, japaneseName: '天平宝字', romanizedName: 
"Tenpyō-hōji" },
+        { startingYear: 765, japaneseName: '天平神護', romanizedName: 
"Tenpyō-jingo" },
+        { startingYear: 767, japaneseName: '神護景雲', romanizedName: 
"Jingo-keiun" },
+        { startingYear: 770, japaneseName: '宝亀', romanizedName: "Hōki" },
+        { startingYear: 781, japaneseName: '天応', romanizedName: "Ten'ō" },
+        { startingYear: 782, japaneseName: '延暦', romanizedName: "Enryaku" 
},
+        { startingYear: 806, japaneseName: '大同', romanizedName: "Daidō" },
+        { startingYear: 810, japaneseName: '弘仁', romanizedName: "Kōnin" },
+        { startingYear: 824, japaneseName: '天長', romanizedName: "Tenchō" 
},
+        { startingYear: 834, japaneseName: '承和', romanizedName: "Jōwa" },
+        { startingYear: 848, japaneseName: '嘉祥', romanizedName: "Kajō" },
+        { startingYear: 851, japaneseName: '仁寿', romanizedName: "Ninju" },
+        { startingYear: 854, japaneseName: '斉衡', romanizedName: "Saikō" },
+        { startingYear: 857, japaneseName: '天安', romanizedName: "Tennan" },
+        { startingYear: 859, japaneseName: '貞観', romanizedName: "Jōgan" },
+        { startingYear: 877, japaneseName: '元慶', romanizedName: "Gangyō" 
},
+        { startingYear: 885, japaneseName: '仁和', romanizedName: "Ninna" },
+        { startingYear: 889, japaneseName: '寛平', romanizedName: "Kanpyō" 
},
+        { startingYear: 898, japaneseName: '昌泰', romanizedName: "Shōtai" 
},
+        { startingYear: 901, japaneseName: '延喜', romanizedName: "Engi" },
+        { startingYear: 923, japaneseName: '延長', romanizedName: "Enchō" },
+        { startingYear: 931, japaneseName: '承平', romanizedName: "Jōhei" },
+        { startingYear: 938, japaneseName: '天慶', romanizedName: "Tengyō" 
},
+        { startingYear: 947, japaneseName: '天暦', romanizedName: "Tenryaku" 
},
+        { startingYear: 957, japaneseName: '天徳', romanizedName: "Tentoku" 
},
+        { startingYear: 961, japaneseName: '応和', romanizedName: "Ōwa" },
+        { startingYear: 964, japaneseName: '康保', romanizedName: "Kōhō" },
+        { startingYear: 968, japaneseName: '安和', romanizedName: "Anna" },
+        { startingYear: 970, japaneseName: '天禄', romanizedName: "Tenroku" 
},
+        { startingYear: 973, japaneseName: '天延', romanizedName: "Ten'en" },
+        { startingYear: 976, japaneseName: '貞元', romanizedName: "Jōgen" },
+        { startingYear: 978, japaneseName: '天元', romanizedName: "Tengen" },
+        { startingYear: 983, japaneseName: '永観', romanizedName: "Eikan" },
+        { startingYear: 985, japaneseName: '寛和', romanizedName: "Kanna" },
+        { startingYear: 987, japaneseName: '永延', romanizedName: "Eien" },
+        { startingYear: 988, japaneseName: '永祚', romanizedName: "Eiso" },
+        { startingYear: 990, japaneseName: '正暦', romanizedName: 
"Shōryaku" },
+        { startingYear: 995, japaneseName: '長徳', romanizedName: "Chōtoku" 
},
+        { startingYear: 999, japaneseName: '長保', romanizedName: "Chōhō" 
},
+        { startingYear: 1004, japaneseName: '寛弘', romanizedName: "Kankō" 
},
+        { startingYear: 1012, japaneseName: '長和', romanizedName: "Chōwa" 
},
+        { startingYear: 1017, japaneseName: '寛仁', romanizedName: "Kannin" 
},
+        { startingYear: 1021, japaneseName: '治安', romanizedName: "Jian" },
+        { startingYear: 1024, japaneseName: '万寿', romanizedName: "Manju" },
+        { startingYear: 1028, japaneseName: '長元', romanizedName: "Chōgen" 
},
+        { startingYear: 1037, japaneseName: '長暦', romanizedName: 
"Chōryaku" },
+        { startingYear: 1040, japaneseName: '長久', romanizedName: 
"Chōkyū" },
+        { startingYear: 1044, japaneseName: '寛徳', romanizedName: "Kantoku" 
},
+        { startingYear: 1046, japaneseName: '永承', romanizedName: "Eishō" 
},
+        { startingYear: 1053, japaneseName: '天喜', romanizedName: "Tengi" },
+        { startingYear: 1058, japaneseName: '康平', romanizedName: "Kōhei" 
},
+        { startingYear: 1065, japaneseName: '治暦', romanizedName: "Jiryaku" 
},
+        { startingYear: 1069, japaneseName: '延久', romanizedName: "Enkyū" 
},
+        { startingYear: 1074, japaneseName: '承保', romanizedName: "Jōhō" 
},
+        { startingYear: 1077, japaneseName: '承暦', romanizedName: 
"Jōryaku" },
+        { startingYear: 1081, japaneseName: '永保', romanizedName: "Eihō" },
+        { startingYear: 1084, japaneseName: '応徳', romanizedName: "Ōtoku" 
},
+        { startingYear: 1087, japaneseName: '寛治', romanizedName: "Kanji" },
+        { startingYear: 1094, japaneseName: '嘉保', romanizedName: "Kahō" },
+        { startingYear: 1096, japaneseName: '永長', romanizedName: "Eichō" 
},
+        { startingYear: 1097, japaneseName: '承徳', romanizedName: "Jōtoku" 
},
+        { startingYear: 1099, japaneseName: '康和', romanizedName: "Kōwa" },
+        { startingYear: 1104, japaneseName: '長治', romanizedName: "Chōji" 
},
+        { startingYear: 1106, japaneseName: '嘉承', romanizedName: "Kajō" },
+        { startingYear: 1108, japaneseName: '天仁', romanizedName: "Tennin" 
},
+        { startingYear: 1110, japaneseName: '天永', romanizedName: "Ten'ei" 
},
+        { startingYear: 1113, japaneseName: '永久', romanizedName: "Eikyū" 
},
+        { startingYear: 1118, japaneseName: '元永', romanizedName: "Gen'ei" 
},
+        { startingYear: 1120, japaneseName: '保安', romanizedName: "Hōan" },
+        { startingYear: 1124, japaneseName: '天治', romanizedName: "Tenji" },
+        { startingYear: 1126, japaneseName: '大治', romanizedName: "Daiji" },
+        { startingYear: 1131, japaneseName: '天承', romanizedName: "Tenshō" 
},
+        { startingYear: 1132, japaneseName: '長承', romanizedName: 
"Chōshō" },
+        { startingYear: 1135, japaneseName: '保延', romanizedName: "Hōen" },
+        { startingYear: 1141, japaneseName: '永治', romanizedName: "Eiji" },
+        { startingYear: 1142, japaneseName: '康治', romanizedName: "Kōji" },
+        { startingYear: 1144, japaneseName: '天養', romanizedName: "Ten'yō" 
},
+        { startingYear: 1145, japaneseName: '久安', romanizedName: "Kyūan" 
},
+        { startingYear: 1151, japaneseName: '仁平', romanizedName: "Ninpei" 
},
+        { startingYear: 1154, japaneseName: '久寿', romanizedName: "Kyūju" 
},
+        { startingYear: 1156, japaneseName: '保元', romanizedName: "Hōgen" 
},
+        { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
+        { startingYear: 1160, japaneseName: '永暦', romanizedName: "Eiryaku" 
},
+        { startingYear: 1161, japaneseName: '応保', romanizedName: "Ōhō" },
+        { startingYear: 1163, japaneseName: '長寛', romanizedName: "Chōkan" 
},
+        { startingYear: 1165, japaneseName: '永万', romanizedName: "Eiman" },
+        { startingYear: 1166, japaneseName: '仁安', romanizedName: "Ninnan" 
},
+        { startingYear: 1169, japaneseName: '嘉応', romanizedName: "Kaō" },
+        { startingYear: 1171, japaneseName: '承安', romanizedName: "Jōan" },
+        { startingYear: 1175, japaneseName: '安元', romanizedName: "Angen" },
+        { startingYear: 1177, japaneseName: '治承', romanizedName: "Jishō" 
},
+        { startingYear: 1181, japaneseName: '養和', romanizedName: "Yōwa" },
+        { startingYear: 1182, japaneseName: '寿永', romanizedName: "Juei" },
+        { startingYear: 1184, japaneseName: '元暦', romanizedName: 
"Genryaku" },
+        { startingYear: 1185, japaneseName: '文治', romanizedName: "Bunji" },
+        { startingYear: 1190, japaneseName: '建久', romanizedName: "Kenkyū" 
},
+        { startingYear: 1199, japaneseName: '正治', romanizedName: "Shōji" 
},
+        { startingYear: 1201, japaneseName: '建仁', romanizedName: "Kennin" 
},
+        { startingYear: 1204, japaneseName: '元久', romanizedName: "Genkyū" 
},
+        { startingYear: 1206, japaneseName: '建永', romanizedName: "Ken'ei" 
},
+        { startingYear: 1207, japaneseName: '承元', romanizedName: "Jōgen" 
},
+        { startingYear: 1211, japaneseName: '建暦', romanizedName: 
"Kenryaku" },
+        { startingYear: 1213, japaneseName: '建保', romanizedName: "Kenpō" 
},
+        { startingYear: 1219, japaneseName: '承久', romanizedName: "Jōkyū" 
},
+        { startingYear: 1222, japaneseName: '貞応', romanizedName: "Jōō" },
+        { startingYear: 1224, japaneseName: '元仁', romanizedName: "Gennin" 
},
+        { startingYear: 1225, japaneseName: '嘉禄', romanizedName: "Karoku" 
},
+        { startingYear: 1227, japaneseName: '安貞', romanizedName: "Antei" },
+        { startingYear: 1229, japaneseName: '寛喜', romanizedName: "Kanki" },
+        { startingYear: 1232, japaneseName: '貞永', romanizedName: "Jōei" },
+        { startingYear: 1233, japaneseName: '天福', romanizedName: "Tenpuku" 
},
+        { startingYear: 1234, japaneseName: '文暦', romanizedName: 
"Bunryaku" },
+        { startingYear: 1235, japaneseName: '嘉禎', romanizedName: "Katei" },
+        { startingYear: 1238, japaneseName: '暦仁', romanizedName: 
"Ryakunin" },
+        { startingYear: 1239, japaneseName: '延応', romanizedName: "En'ō" },
+        { startingYear: 1240, japaneseName: '仁治', romanizedName: "Ninji" },
+        { startingYear: 1243, japaneseName: '寛元', romanizedName: "Kangen" 
},
+        { startingYear: 1247, japaneseName: '宝治', romanizedName: "Hōji" },
+        { startingYear: 1249, japaneseName: '建長', romanizedName: "Kenchō" 
},
+        { startingYear: 1256, japaneseName: '康元', romanizedName: "Kōgen" 
},
+        { startingYear: 1257, japaneseName: '正嘉', romanizedName: "Shōka" 
},
+        { startingYear: 1259, japaneseName: '正元', romanizedName: "Shōgen" 
},
+        { startingYear: 1260, japaneseName: '文応', romanizedName: "Bun'ō" 
},
+        { startingYear: 1261, japaneseName: '弘長', romanizedName: "Kōcho" 
},
+        { startingYear: 1264, japaneseName: '文永', romanizedName: "Bun'ei" 
},
+        { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
+        { startingYear: 1278, japaneseName: '弘安', romanizedName: "Kōan" },
+        { startingYear: 1288, japaneseName: '正応', romanizedName: "Shōō" 
},
+        { startingYear: 1293, japaneseName: '永仁', romanizedName: "Einin" },
+        { startingYear: 1299, japaneseName: '正安', romanizedName: "Shōan" 
},
+        { startingYear: 1302, japaneseName: '乾元', romanizedName: "Kengen" 
},
+        { startingYear: 1303, japaneseName: '嘉元', romanizedName: "Kagen" },
+        { startingYear: 1306, japaneseName: '徳治', romanizedName: "Tokuji" 
},
+        { startingYear: 1308, japaneseName: '延慶', romanizedName: "Enkei" },
+        { startingYear: 1311, japaneseName: '応長', romanizedName: "Ōchō" 
},
+        { startingYear: 1312, japaneseName: '正和', romanizedName: "Shōwa" 
},
+        { startingYear: 1317, japaneseName: '文保', romanizedName: "Bunpō" 
},
+        { startingYear: 1319, japaneseName: '元応', romanizedName: "Gen'ō" 
},
+        { startingYear: 1321, japaneseName: '元亨', romanizedName: "Genkyō" 
},
+        { startingYear: 1324, japaneseName: '正中', romanizedName: 
"Shōchū" },
+        { startingYear: 1326, japaneseName: '嘉暦', romanizedName: "Karyaku" 
},
+        { startingYear: 1329, japaneseName: '元徳', romanizedName: "Gentoku" 
},
+        { startingYear: 1331, japaneseName: '元弘', romanizedName: "Genkō" 
},
+        { startingYear: 1334, japaneseName: '建武', romanizedName: "Kenmu" },
+        { startingYear: 1336, japaneseName: '延元', romanizedName: "Engen" },
+        { startingYear: 1340, japaneseName: '興国', romanizedName: "Kōkoku" 
},
+        { startingYear: 1346, japaneseName: '正平', romanizedName: "Shōhei" 
},
+        { startingYear: 1370, japaneseName: '建徳', romanizedName: "Kentoku" 
},
+        { startingYear: 1372, japaneseName: '文中', romanizedName: "Bunchū" 
},
+        { startingYear: 1375, japaneseName: '天授', romanizedName: "Tenju" },
+        { startingYear: 1381, japaneseName: '弘和', romanizedName: "Kōwa" },
+        { startingYear: 1384, japaneseName: '元中', romanizedName: "Genchū" 
},
+        { startingYear: 1332, japaneseName: '正慶', romanizedName: "Shōkei" 
},
+        { startingYear: 1338, japaneseName: '暦応', romanizedName: "Ryakuō" 
},
+        { startingYear: 1342, japaneseName: '康永', romanizedName: "Kōei" },
+        { startingYear: 1345, japaneseName: '貞和', romanizedName: "Jōwa" },
+        { startingYear: 1350, japaneseName: '観応', romanizedName: "Kan'ō" 
},
+        { startingYear: 1352, japaneseName: '文和', romanizedName: "Bunna" },
+        { startingYear: 1356, japaneseName: '延文', romanizedName: "Enbun" },
+        { startingYear: 1361, japaneseName: '康安', romanizedName: "Kōan" },
+        { startingYear: 1362, japaneseName: '貞治', romanizedName: "Jōji" },
+        { startingYear: 1368, japaneseName: '応安', romanizedName: "Ōan" },
+        { startingYear: 1375, japaneseName: '永和', romanizedName: "Eiwa" },
+        { startingYear: 1379, japaneseName: '康暦', romanizedName: 
"Kōryaku" },
+        { startingYear: 1381, japaneseName: '永徳', romanizedName: "Eitoku" 
},
+        { startingYear: 1384, japaneseName: '至徳', romanizedName: "Shitoku" 
},
+        { startingYear: 1387, japaneseName: '嘉慶', romanizedName: "Kakei" },
+        { startingYear: 1389, japaneseName: '康応', romanizedName: "Kōō" },
+        { startingYear: 1390, japaneseName: '明徳', romanizedName: "Meitoku" 
},
+        { startingYear: 1394, japaneseName: '応永', romanizedName: "Ōei" },
+        { startingYear: 1428, japaneseName: '正長', romanizedName: 
"Shōchō" },
+        { startingYear: 1429, japaneseName: '永享', romanizedName: "Eikyō" 
},
+        { startingYear: 1441, japaneseName: '嘉吉', romanizedName: "Kakitsu" 
},
+        { startingYear: 1444, japaneseName: '文安', romanizedName: "Bunnan" 
},
+        { startingYear: 1449, japaneseName: '宝徳', romanizedName: "Hōtoku" 
},
+        { startingYear: 1452, japaneseName: '享徳', romanizedName: 
"Kyōtoku" },
+        { startingYear: 1455, japaneseName: '康正', romanizedName: "Kōshō" 
},
+        { startingYear: 1457, japaneseName: '長禄', romanizedName: 
"Chōroku" },
+        { startingYear: 1460, japaneseName: '寛正', romanizedName: "Kanshō" 
},
+        { startingYear: 1466, japaneseName: '文正', romanizedName: "Bunshō" 
},
+        { startingYear: 1467, japaneseName: '応仁', romanizedName: "Ōnin" },
+        { startingYear: 1469, japaneseName: '文明', romanizedName: "Bunmei" 
},
+        { startingYear: 1487, japaneseName: '長享', romanizedName: 
"Chōkyō" },
+        { startingYear: 1489, japaneseName: '延徳', romanizedName: "Entoku" 
},
+        { startingYear: 1492, japaneseName: '明応', romanizedName: "Meiō" },
+        { startingYear: 1501, japaneseName: '文亀', romanizedName: "Bunki" },
+        { startingYear: 1504, japaneseName: '永正', romanizedName: "Eishō" 
},
+        { startingYear: 1521, japaneseName: '大永', romanizedName: "Daiei" },
+        { startingYear: 1528, japaneseName: '享禄', romanizedName: 
"Kyōroku" },
+        { startingYear: 1532, japaneseName: '天文', romanizedName: "Tenbun" 
},
+        { startingYear: 1555, japaneseName: '弘治', romanizedName: "Kōji" },
+        { startingYear: 1558, japaneseName: '永禄', romanizedName: "Eiroku" 
},
+        { startingYear: 1570, japaneseName: '元亀', romanizedName: "Genki" },
+        { startingYear: 1573, japaneseName: '天正', romanizedName: "Tenshō" 
},
+        { startingYear: 1592, japaneseName: '文禄', romanizedName: "Bunroku" 
},
+        { startingYear: 1596, japaneseName: '慶長', romanizedName: "Keichō" 
},
+        { startingYear: 1615, japaneseName: '元和', romanizedName: "Genna" },
+        { startingYear: 1624, japaneseName: '寛永', romanizedName: "Kan'ei" 
},
+        { startingYear: 1644, japaneseName: '正保', romanizedName: "Shōhō" 
},
+        { startingYear: 1648, japaneseName: '慶安', romanizedName: "Keian" },
+        { startingYear: 1652, japaneseName: '承応', romanizedName: "Jōō" },
+        { startingYear: 1655, japaneseName: '明暦', romanizedName: "Meireki" 
},
+        { startingYear: 1658, japaneseName: '万治', romanizedName: "Manji" },
+        { startingYear: 1661, japaneseName: '寛文', romanizedName: "Kanbun" 
},
+        { startingYear: 1673, japaneseName: '延宝', romanizedName: "Enpō" },
+        { startingYear: 1681, japaneseName: '天和', romanizedName: "Tenna" },
+        { startingYear: 1684, japaneseName: '貞享', romanizedName: "Jōkyō" 
},
+        { startingYear: 1688, japaneseName: '元禄', romanizedName: "Genroku" 
},
+        { startingYear: 1704, japaneseName: '宝永', romanizedName: "Hōei" },
+        { startingYear: 1711, japaneseName: '正徳', romanizedName: 
"Shōtoku" },
+        { startingYear: 1716, japaneseName: '享保', romanizedName: "Kyōhō" 
},
+        { startingYear: 1736, japaneseName: '元文', romanizedName: "Genbun" 
},
+        { startingYear: 1741, japaneseName: '寛保', romanizedName: "Kanpō" 
},
+        { startingYear: 1744, japaneseName: '延享', romanizedName: "Enkyō" 
},
+        { startingYear: 1748, japaneseName: '寛延', romanizedName: "Kan'en" 
},
+        { startingYear: 1751, japaneseName: '宝暦', romanizedName: "Hōreki" 
},
+        { startingYear: 1764, japaneseName: '明和', romanizedName: "Meiwa" },
+        { startingYear: 1772, japaneseName: '安永', romanizedName: "An'ei" },
+        { startingYear: 1781, japaneseName: '天明', romanizedName: "Tenmei" 
},
+        { startingYear: 1789, japaneseName: '寛政', romanizedName: "Kansei" 
},
+        { startingYear: 1801, japaneseName: '享和', romanizedName: "Kyōwa" 
},
+        { startingYear: 1804, japaneseName: '文化', romanizedName: "Bunka" },
+        { startingYear: 1818, japaneseName: '文政', romanizedName: "Bunsei" 
},
+        { startingYear: 1830, japaneseName: '天保', romanizedName: "Tenpō" 
},
+        { startingYear: 1844, japaneseName: '弘化', romanizedName: "Kōka" },
+        { startingYear: 1848, japaneseName: '嘉永', romanizedName: "Kaei" },
+        { startingYear: 1854, japaneseName: '安政', romanizedName: "Ansei" },
+        { startingYear: 1860, japaneseName: '万延', romanizedName: "Man'en" 
},
+        { startingYear: 1861, japaneseName: '文久', romanizedName: "Bunkyū" 
},
+        { startingYear: 1864, japaneseName: '元治', romanizedName: "Genji" },
+        { startingYear: 1865, japaneseName: '慶応', romanizedName: "Keiō" },
+        { startingYear: 1868, japaneseName: '明治', romanizedName: "Meiji" },
+        { startingYear: 1912, japaneseName: '大正', romanizedName: "Taishō" 
},
+        { startingYear: 1926, japaneseName: '昭和', romanizedName: "Shōwa" 
},
+        { startingYear: 1989, japaneseName: '平成', romanizedName: "Heisei" }
+    ]
+);

Added: 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/labellers.js
==============================================================================
--- 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/labellers.js
 (added)
+++ 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/labellers.js
 Wed Apr 12 14:40:22 2017
@@ -0,0 +1,91 @@
+/*==================================================
+ *  Gregorian Date Labeller
+ *==================================================
+ */
+
+Timeline.GregorianDateLabeller = function(locale, timeZone) {
+    this._locale = locale;
+    this._timeZone = timeZone;
+};
+
+Timeline.GregorianDateLabeller.monthNames = [];
+Timeline.GregorianDateLabeller.dayNames = [];
+Timeline.GregorianDateLabeller.labelIntervalFunctions = [];
+
+Timeline.GregorianDateLabeller.getMonthName = function(month, locale) {
+    return Timeline.GregorianDateLabeller.monthNames[locale][month];
+};
+
+Timeline.GregorianDateLabeller.prototype.labelInterval = function(date, 
intervalUnit) {
+    var f = 
Timeline.GregorianDateLabeller.labelIntervalFunctions[this._locale];
+    if (f == null) {
+        f = Timeline.GregorianDateLabeller.prototype.defaultLabelInterval;
+    }
+    return f.call(this, date, intervalUnit);
+};
+
+Timeline.GregorianDateLabeller.prototype.labelPrecise = function(date) {
+    return SimileAjax.DateTime.removeTimeZoneOffset(
+        date, 
+        this._timeZone //+ (new Date().getTimezoneOffset() / 60)
+    ).toUTCString();
+};
+
+Timeline.GregorianDateLabeller.prototype.defaultLabelInterval = function(date, 
intervalUnit) {
+    var text;
+    var emphasized = false;
+    
+    date = SimileAjax.DateTime.removeTimeZoneOffset(date, this._timeZone);
+    
+    switch(intervalUnit) {
+    case SimileAjax.DateTime.MILLISECOND:
+        text = date.getUTCMilliseconds();
+        break;
+    case SimileAjax.DateTime.SECOND:
+        text = date.getUTCSeconds();
+        break;
+    case SimileAjax.DateTime.MINUTE:
+        var m = date.getUTCMinutes();
+        if (m == 0) {
+            text = date.getUTCHours() + ":00";
+            emphasized = true;
+        } else {
+            text = m;
+        }
+        break;
+    case SimileAjax.DateTime.HOUR:
+        text = date.getUTCHours() + "hr";
+        break;
+    case SimileAjax.DateTime.DAY:
+        text = Timeline.GregorianDateLabeller.getMonthName(date.getUTCMonth(), 
this._locale) + " " + date.getUTCDate();
+        break;
+    case SimileAjax.DateTime.WEEK:
+        text = Timeline.GregorianDateLabeller.getMonthName(date.getUTCMonth(), 
this._locale) + " " + date.getUTCDate();
+        break;
+    case SimileAjax.DateTime.MONTH:
+        var m = date.getUTCMonth();
+        if (m != 0) {
+            text = Timeline.GregorianDateLabeller.getMonthName(m, 
this._locale);
+            break;
+        } // else, fall through
+    case SimileAjax.DateTime.YEAR:
+    case SimileAjax.DateTime.DECADE:
+    case SimileAjax.DateTime.CENTURY:
+    case SimileAjax.DateTime.MILLENNIUM:
+        var y = date.getUTCFullYear();
+        if (y > 0) {
+            text = date.getUTCFullYear();
+        } else {
+            text = (1 - y) + "BC";
+        }
+        emphasized = 
+            (intervalUnit == SimileAjax.DateTime.MONTH) ||
+            (intervalUnit == SimileAjax.DateTime.DECADE && y % 100 == 0) || 
+            (intervalUnit == SimileAjax.DateTime.CENTURY && y % 1000 == 0);
+        break;
+    default:
+        text = date.toUTCString();
+    }
+    return { text: text, emphasized: emphasized };
+}
+

Added: 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/original-painter.js
==============================================================================
--- 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/original-painter.js
 (added)
+++ 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/original-painter.js
 Wed Apr 12 14:40:22 2017
@@ -0,0 +1,674 @@
+/*==================================================
+ *  Original Event Painter
+ *==================================================
+ */
+
+/*==================================================
+ * 
+ * To enable a single event listener to monitor everything
+ * on a Timeline, we need a way to map from an event's icon,
+ * label or tape element to the associated timeline, band and
+ * specific event.
+ *
+ * Thus a set format is used for the id's of the 
+ * events' elements on the Timeline--
+ * 
+ * element id format for labels, icons, tapes:
+ *   labels: label-tl-<timelineID>-<band_index>-<evt.id>
+ *    icons: icon-tl-<timelineID>-<band_index>-<evt.id>
+ *    tapes: tape1-tl-<timelineID>-<band_index>-<evt.id>
+ *           tape2-tl-<timelineID>-<band_index>-<evt.id>
+ *           // some events have more than one tape
+ *    highlight: highlight1-tl-<timelineID>-<band_index>-<evt.id>
+ *               highlight2-tl-<timelineID>-<band_index>-<evt.id>
+ *           // some events have more than one highlight div (future) 
+ * You can then retrieve the band/timeline objects and event object
+ * by using Timeline.EventUtils.decodeEventElID
+ *
+ *==================================================
+ */
+ 
+/* 
+ *    eventPaintListener functions receive calls about painting.
+ *    function(band, op, evt, els)
+ *       context: 'this' will be an OriginalEventPainter object.
+ *                It has properties and methods for obtaining
+ *                the relevant band, timeline, etc    
+ *       band = the band being painted
+ *       op = 'paintStarting' // the painter is about to remove
+ *            all previously painted events, if any. It will
+ *            then start painting all of the visible events that
+ *            pass the filter. 
+ *            evt = null, els = null
+ *       op = 'paintEnded' // the painter has finished painting
+ *            all of the visible events that passed the filter
+ *            evt = null, els = null
+ *       op = 'paintedEvent' // the painter just finished painting an event
+ *            evt = event just painted
+ *            els = array of painted elements' divs. Depending on the event,
+ *                  the array could be just a tape or icon (if no label).
+ *                  Or could include label, multiple tape divs (imprecise 
event),
+ *                  highlight divs. The array is not ordered. The meaning of
+ *                  each el is available by decoding the el's id 
+ *      Note that there may be no paintedEvent calls if no events were visible
+ *      or passed the filter.
+ */
+
+Timeline.OriginalEventPainter = function(params) {
+    this._params = params;
+    this._onSelectListeners = [];
+    this._eventPaintListeners = [];
+    
+    this._filterMatcher = null;
+    this._highlightMatcher = null;
+    this._frc = null;
+    
+    this._eventIdToElmt = {};
+};
+
+Timeline.OriginalEventPainter.prototype.initialize = function(band, timeline) {
+    this._band = band;
+    this._timeline = timeline;
+    
+    this._backLayer = null;
+    this._eventLayer = null;
+    this._lineLayer = null;
+    this._highlightLayer = null;
+    
+    this._eventIdToElmt = null;
+};
+
+Timeline.OriginalEventPainter.prototype.getType = function() {
+    return 'original';
+};
+
+Timeline.OriginalEventPainter.prototype.addOnSelectListener = 
function(listener) {
+    this._onSelectListeners.push(listener);
+};
+
+Timeline.OriginalEventPainter.prototype.removeOnSelectListener = 
function(listener) {
+    for (var i = 0; i < this._onSelectListeners.length; i++) {
+        if (this._onSelectListeners[i] == listener) {
+            this._onSelectListeners.splice(i, 1);
+            break;
+        }
+    }
+};
+
+Timeline.OriginalEventPainter.prototype.addEventPaintListener = 
function(listener) {
+    this._eventPaintListeners.push(listener);
+};
+
+Timeline.OriginalEventPainter.prototype.removeEventPaintListener = 
function(listener) {
+    for (var i = 0; i < this._eventPaintListeners.length; i++) {
+        if (this._eventPaintListeners[i] == listener) {
+            this._eventPaintListeners.splice(i, 1);
+            break;
+        }
+    }
+};
+
+Timeline.OriginalEventPainter.prototype.getFilterMatcher = function() {
+    return this._filterMatcher;
+};
+
+Timeline.OriginalEventPainter.prototype.setFilterMatcher = 
function(filterMatcher) {
+    this._filterMatcher = filterMatcher;
+};
+
+Timeline.OriginalEventPainter.prototype.getHighlightMatcher = function() {
+    return this._highlightMatcher;
+};
+
+Timeline.OriginalEventPainter.prototype.setHighlightMatcher = 
function(highlightMatcher) {
+    this._highlightMatcher = highlightMatcher;
+};
+
+Timeline.OriginalEventPainter.prototype.paint = function() {
+    // Paints the events for a given section of the band--what is
+    // visible on screen and some extra.
+    var eventSource = this._band.getEventSource();
+    if (eventSource == null) {
+        return;
+    }
+    
+    this._eventIdToElmt = {};
+    this._fireEventPaintListeners('paintStarting', null, null);
+    this._prepareForPainting();
+    
+    var eventTheme = this._params.theme.event;
+    var trackHeight = Math.max(eventTheme.track.height, eventTheme.tape.height 
+ 
+                        this._frc.getLineHeight());
+    var metrics = {
+           trackOffset: eventTheme.track.offset,
+           trackHeight: trackHeight,
+              trackGap: eventTheme.track.gap,
+        trackIncrement: trackHeight + eventTheme.track.gap,
+                  icon: eventTheme.instant.icon,
+             iconWidth: eventTheme.instant.iconWidth,
+            iconHeight: eventTheme.instant.iconHeight,
+            labelWidth: eventTheme.label.width,
+          maxLabelChar: eventTheme.label.maxLabelChar,
+   impreciseIconMargin: eventTheme.instant.impreciseIconMargin
+    }
+    
+    var minDate = this._band.getMinDate();
+    var maxDate = this._band.getMaxDate();
+    
+    var filterMatcher = (this._filterMatcher != null) ? 
+        this._filterMatcher :
+        function(evt) { return true; };
+    var highlightMatcher = (this._highlightMatcher != null) ? 
+        this._highlightMatcher :
+        function(evt) { return -1; };
+    
+    var iterator = eventSource.getEventReverseIterator(minDate, maxDate);
+    while (iterator.hasNext()) {
+        var evt = iterator.next();
+        if (filterMatcher(evt)) {
+            this.paintEvent(evt, metrics, this._params.theme, 
highlightMatcher(evt));
+        }
+    }
+    
+    this._highlightLayer.style.display = "block";
+    this._lineLayer.style.display = "block";
+    this._eventLayer.style.display = "block";
+    // update the band object for max number of tracks in this section of the 
ether
+    this._band.updateEventTrackInfo(this._tracks.length, 
metrics.trackIncrement); 
+    this._fireEventPaintListeners('paintEnded', null, null);
+};
+
+Timeline.OriginalEventPainter.prototype.softPaint = function() {
+};
+
+Timeline.OriginalEventPainter.prototype._prepareForPainting = function() {
+    // Remove everything previously painted: highlight, line and event layers.
+    // Prepare blank layers for painting. 
+    var band = this._band;
+        
+    if (this._backLayer == null) {
+        this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
+        this._backLayer.style.visibility = "hidden";
+        
+        var eventLabelPrototype = document.createElement("span");
+        eventLabelPrototype.className = "timeline-event-label";
+        this._backLayer.appendChild(eventLabelPrototype);
+        this._frc = 
SimileAjax.Graphics.getFontRenderingContext(eventLabelPrototype);
+    }
+    this._frc.update();
+    this._tracks = [];
+    
+    if (this._highlightLayer != null) {
+        band.removeLayerDiv(this._highlightLayer);
+    }
+    this._highlightLayer = band.createLayerDiv(105, 
"timeline-band-highlights");
+    this._highlightLayer.style.display = "none";
+    
+    if (this._lineLayer != null) {
+        band.removeLayerDiv(this._lineLayer);
+    }
+    this._lineLayer = band.createLayerDiv(110, "timeline-band-lines");
+    this._lineLayer.style.display = "none";
+    
+    if (this._eventLayer != null) {
+        band.removeLayerDiv(this._eventLayer);
+    }
+    this._eventLayer = band.createLayerDiv(115, "timeline-band-events");
+    this._eventLayer.style.display = "none";
+};
+
+Timeline.OriginalEventPainter.prototype.paintEvent = function(evt, metrics, 
theme, highlightIndex) {
+    if (evt.isInstant()) {
+        this.paintInstantEvent(evt, metrics, theme, highlightIndex);
+    } else {
+        this.paintDurationEvent(evt, metrics, theme, highlightIndex);
+    }
+};
+    
+Timeline.OriginalEventPainter.prototype.paintInstantEvent = function(evt, 
metrics, theme, highlightIndex) {
+    if (evt.isImprecise()) {
+        this.paintImpreciseInstantEvent(evt, metrics, theme, highlightIndex);
+    } else {
+        this.paintPreciseInstantEvent(evt, metrics, theme, highlightIndex);
+    }
+}
+
+Timeline.OriginalEventPainter.prototype.paintDurationEvent = function(evt, 
metrics, theme, highlightIndex) {
+    if (evt.isImprecise()) {
+        this.paintImpreciseDurationEvent(evt, metrics, theme, highlightIndex);
+    } else {
+        this.paintPreciseDurationEvent(evt, metrics, theme, highlightIndex);
+    }
+}
+    
+Timeline.OriginalEventPainter.prototype.paintPreciseInstantEvent = 
function(evt, metrics, theme, highlightIndex) {
+    var doc = this._timeline.getDocument();
+    var text = evt.getText();
+    
+    var startDate = evt.getStart();
+    var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
+    var iconRightEdge = Math.round(startPixel + metrics.iconWidth / 2);
+    var iconLeftEdge = Math.round(startPixel - metrics.iconWidth / 2);
+
+    var labelDivClassName = this._getLabelDivClassName(evt);
+    var labelSize = this._frc.computeSize(text, labelDivClassName);
+    var labelLeft = iconRightEdge + theme.event.label.offsetFromLine;
+    var labelRight = labelLeft + labelSize.width;
+    
+    var rightEdge = labelRight;
+    var track = this._findFreeTrack(evt, rightEdge);
+    
+    var labelTop = Math.round(
+        metrics.trackOffset + track * metrics.trackIncrement + 
+        metrics.trackHeight / 2 - labelSize.height / 2);
+        
+    var iconElmtData = this._paintEventIcon(evt, track, iconLeftEdge, metrics, 
theme, 0);
+    var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop, 
labelSize.width,
+        labelSize.height, theme, labelDivClassName, highlightIndex);
+    var els = [iconElmtData.elmt, labelElmtData.elmt];
+
+    var self = this;
+    var clickHandler = function(elmt, domEvt, target) {
+        return self._onClickInstantEvent(iconElmtData.elmt, domEvt, evt);
+    };
+    SimileAjax.DOM.registerEvent(iconElmtData.elmt, "mousedown", clickHandler);
+    SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", 
clickHandler);
+    
+    var hDiv = this._createHighlightDiv(highlightIndex, iconElmtData, theme, 
evt);
+    if (hDiv != null) {els.push(hDiv);}
+    this._fireEventPaintListeners('paintedEvent', evt, els);
+
+    
+    this._eventIdToElmt[evt.getID()] = iconElmtData.elmt;
+    this._tracks[track] = iconLeftEdge;
+};
+
+Timeline.OriginalEventPainter.prototype.paintImpreciseInstantEvent = 
function(evt, metrics, theme, highlightIndex) {
+    var doc = this._timeline.getDocument();
+    var text = evt.getText();
+    
+    var startDate = evt.getStart();
+    var endDate = evt.getEnd();
+    var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
+    var endPixel = Math.round(this._band.dateToPixelOffset(endDate));
+    
+    var iconRightEdge = Math.round(startPixel + metrics.iconWidth / 2);
+    var iconLeftEdge = Math.round(startPixel - metrics.iconWidth / 2);
+    
+    var labelDivClassName = this._getLabelDivClassName(evt);
+    var labelSize = this._frc.computeSize(text, labelDivClassName);
+    var labelLeft = iconRightEdge + theme.event.label.offsetFromLine;
+    var labelRight = labelLeft + labelSize.width;
+    
+    var rightEdge = Math.max(labelRight, endPixel);
+    var track = this._findFreeTrack(evt, rightEdge);
+    var tapeHeight = theme.event.tape.height;
+    var labelTop = Math.round(
+        metrics.trackOffset + track * metrics.trackIncrement + tapeHeight);
+
+    var iconElmtData = this._paintEventIcon(evt, track, iconLeftEdge, metrics, 
theme, tapeHeight);
+    var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop, 
labelSize.width,
+                        labelSize.height, theme, labelDivClassName, 
highlightIndex);
+
+    var color = evt.getColor();
+    color = color != null ? color : theme.event.instant.impreciseColor;
+
+    var tapeElmtData = this._paintEventTape(evt, track, startPixel, endPixel, 
+        color, theme.event.instant.impreciseOpacity, metrics, theme, 0);
+    var els = [iconElmtData.elmt, labelElmtData.elmt, tapeElmtData.elmt];    
+    
+    var self = this;
+    var clickHandler = function(elmt, domEvt, target) {
+        return self._onClickInstantEvent(iconElmtData.elmt, domEvt, evt);
+    };
+    SimileAjax.DOM.registerEvent(iconElmtData.elmt, "mousedown", clickHandler);
+    SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown", clickHandler);
+    SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", 
clickHandler);
+    
+    var hDiv = this._createHighlightDiv(highlightIndex, iconElmtData, theme, 
evt);
+    if (hDiv != null) {els.push(hDiv);}
+    this._fireEventPaintListeners('paintedEvent', evt, els);
+
+    this._eventIdToElmt[evt.getID()] = iconElmtData.elmt;
+    this._tracks[track] = iconLeftEdge;
+};
+
+Timeline.OriginalEventPainter.prototype.paintPreciseDurationEvent = 
function(evt, metrics, theme, highlightIndex) {
+    var doc = this._timeline.getDocument();
+    var text = evt.getText();
+    
+    var startDate = evt.getStart();
+    var endDate = evt.getEnd();
+    var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
+    var endPixel = Math.round(this._band.dateToPixelOffset(endDate));
+    
+    var labelDivClassName = this._getLabelDivClassName(evt);
+    var labelSize = this._frc.computeSize(text, labelDivClassName);
+    var labelLeft = startPixel;
+    var labelRight = labelLeft + labelSize.width;
+    
+    var rightEdge = Math.max(labelRight, endPixel);
+    var track = this._findFreeTrack(evt, rightEdge);
+    var labelTop = Math.round(
+        metrics.trackOffset + track * metrics.trackIncrement + 
theme.event.tape.height);
+    
+    var color = evt.getColor();
+    color = color != null ? color : theme.event.duration.color;
+    
+    var tapeElmtData = this._paintEventTape(evt, track, startPixel, endPixel, 
color, 100, metrics, theme, 0);
+    var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop, 
labelSize.width,
+      labelSize.height, theme, labelDivClassName, highlightIndex);
+    var els = [tapeElmtData.elmt, labelElmtData.elmt];
+    
+    var self = this;
+    var clickHandler = function(elmt, domEvt, target) {
+        return self._onClickDurationEvent(tapeElmtData.elmt, domEvt, evt);
+    };
+    SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown", clickHandler);
+    SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", 
clickHandler);
+    
+    var hDiv = this._createHighlightDiv(highlightIndex, tapeElmtData, theme, 
evt);
+    if (hDiv != null) {els.push(hDiv);}
+    this._fireEventPaintListeners('paintedEvent', evt, els);
+    
+    this._eventIdToElmt[evt.getID()] = tapeElmtData.elmt;
+    this._tracks[track] = startPixel;
+};
+
+Timeline.OriginalEventPainter.prototype.paintImpreciseDurationEvent = 
function(evt, metrics, theme, highlightIndex) {
+    var doc = this._timeline.getDocument();
+    var text = evt.getText();
+    
+    var startDate = evt.getStart();
+    var latestStartDate = evt.getLatestStart();
+    var endDate = evt.getEnd();
+    var earliestEndDate = evt.getEarliestEnd();
+    
+    var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
+    var latestStartPixel = 
Math.round(this._band.dateToPixelOffset(latestStartDate));
+    var endPixel = Math.round(this._band.dateToPixelOffset(endDate));
+    var earliestEndPixel = 
Math.round(this._band.dateToPixelOffset(earliestEndDate));
+    
+    var labelDivClassName = this._getLabelDivClassName(evt);
+    var labelSize = this._frc.computeSize(text, labelDivClassName);
+    var labelLeft = latestStartPixel;
+    var labelRight = labelLeft + labelSize.width;
+    
+    var rightEdge = Math.max(labelRight, endPixel);
+    var track = this._findFreeTrack(evt, rightEdge);
+    var labelTop = Math.round(
+        metrics.trackOffset + track * metrics.trackIncrement + 
theme.event.tape.height);
+    
+    var color = evt.getColor();
+    color = color != null ? color : theme.event.duration.color;
+    
+    // Imprecise events can have two event tapes
+    // The imprecise dates tape, uses opacity to be dimmer than precise dates
+    var impreciseTapeElmtData = this._paintEventTape(evt, track, startPixel, 
endPixel, 
+        theme.event.duration.impreciseColor,
+        theme.event.duration.impreciseOpacity, metrics, theme, 0);
+    // The precise dates tape, regular (100%) opacity
+    var tapeElmtData = this._paintEventTape(evt, track, latestStartPixel,
+        earliestEndPixel, color, 100, metrics, theme, 1);
+    
+    var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop,
+        labelSize.width, labelSize.height, theme, labelDivClassName, 
highlightIndex);
+    var els = [impreciseTapeElmtData.elmt, tapeElmtData.elmt, 
labelElmtData.elmt];
+    
+    var self = this;
+    var clickHandler = function(elmt, domEvt, target) {
+        return self._onClickDurationEvent(tapeElmtData.elmt, domEvt, evt);
+    };
+    SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown", clickHandler);
+    SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", 
clickHandler);
+    
+    var hDiv = this._createHighlightDiv(highlightIndex, tapeElmtData, theme, 
evt);
+    if (hDiv != null) {els.push(hDiv);}
+    this._fireEventPaintListeners('paintedEvent', evt, els);
+    
+    this._eventIdToElmt[evt.getID()] = tapeElmtData.elmt;
+    this._tracks[track] = startPixel;
+};
+
+Timeline.OriginalEventPainter.prototype._encodeEventElID = function(elType, 
evt) {
+    return Timeline.EventUtils.encodeEventElID(this._timeline, this._band, 
elType, evt);
+};
+
+Timeline.OriginalEventPainter.prototype._findFreeTrack = function(event, 
rightEdge) {
+    var trackAttribute = event.getTrackNum();
+    if (trackAttribute != null) {
+        return trackAttribute; // early return since event includes track 
number
+    }
+    
+    // normal case: find an open track
+    for (var i = 0; i < this._tracks.length; i++) {
+        var t = this._tracks[i];
+        if (t > rightEdge) {
+            break;
+        }
+    }
+    return i;
+};
+
+Timeline.OriginalEventPainter.prototype._paintEventIcon = function(evt, 
iconTrack, left, metrics, theme, tapeHeight) {
+    // If no tape, then paint the icon in the middle of the track.
+    // If there is a tape, paint the icon below the tape + impreciseIconMargin
+    var icon = evt.getIcon();
+    icon = icon != null ? icon : metrics.icon;
+    
+    var top; // top of the icon
+    if (tapeHeight > 0) {
+        top = metrics.trackOffset + iconTrack * metrics.trackIncrement + 
+              tapeHeight + metrics.impreciseIconMargin;
+    } else {
+        var middle = metrics.trackOffset + iconTrack * metrics.trackIncrement +
+                     metrics.trackHeight / 2;
+        top = Math.round(middle - metrics.iconHeight / 2);
+    }
+    var img = SimileAjax.Graphics.createTranslucentImage(icon);
+    var iconDiv = this._timeline.getDocument().createElement("div");
+    iconDiv.className = this._getElClassName('timeline-event-icon', evt, 
'icon');
+    iconDiv.id = this._encodeEventElID('icon', evt);
+    iconDiv.style.left = left + "px";
+    iconDiv.style.top = top + "px";
+    iconDiv.appendChild(img);
+
+    if(evt._title != null)
+        iconDiv.title = evt._title;
+
+    this._eventLayer.appendChild(iconDiv);
+    
+    return {
+        left:   left,
+        top:    top,
+        width:  metrics.iconWidth,
+        height: metrics.iconHeight,
+        elmt:   iconDiv
+    };
+};
+
+Timeline.OriginalEventPainter.prototype._paintEventLabel = function(evt, text, 
left, top, width,
+    height, theme, labelDivClassName, highlightIndex) {
+    var doc = this._timeline.getDocument();
+    
+    var labelDiv = doc.createElement("div");
+    labelDiv.className = labelDivClassName;
+    labelDiv.id = this._encodeEventElID('label', evt);
+    labelDiv.style.left = left + "px";
+    labelDiv.style.width = width + "px";
+    labelDiv.style.top = top + "px";
+    labelDiv.innerHTML = text;
+
+    if(evt._title != null)
+        labelDiv.title = evt._title;    
+
+    var color = evt.getTextColor();
+    if (color == null) {
+        color = evt.getColor();
+    }
+    if (color != null) {
+        labelDiv.style.color = color;
+    }
+    if (theme.event.highlightLabelBackground && highlightIndex >= 0) {
+        labelDiv.style.background = this._getHighlightColor(highlightIndex, 
theme);
+    }
+    
+    this._eventLayer.appendChild(labelDiv);
+    
+    return {
+        left:   left,
+        top:    top,
+        width:  width,
+        height: height,
+        elmt:   labelDiv
+    };
+};
+
+Timeline.OriginalEventPainter.prototype._paintEventTape = function(
+    evt, iconTrack, startPixel, endPixel, color, opacity, metrics, theme, 
tape_index) {
+    
+    var tapeWidth = endPixel - startPixel;
+    var tapeHeight = theme.event.tape.height;
+    var top = metrics.trackOffset + iconTrack * metrics.trackIncrement;
+    
+    var tapeDiv = this._timeline.getDocument().createElement("div");
+    tapeDiv.className = this._getElClassName('timeline-event-tape', evt, 
'tape');
+    tapeDiv.id = this._encodeEventElID('tape' + tape_index, evt);
+    tapeDiv.style.left = startPixel + "px";
+    tapeDiv.style.width = tapeWidth + "px";
+    tapeDiv.style.height = tapeHeight + "px";
+    tapeDiv.style.top = top + "px";
+
+    if(evt._title != null)
+        tapeDiv.title = evt._title;   
+   
+    if(color != null) {
+        tapeDiv.style.backgroundColor = color;
+    }
+    
+    var backgroundImage = evt.getTapeImage();
+    var backgroundRepeat = evt.getTapeRepeat();
+    backgroundRepeat = backgroundRepeat != null ? backgroundRepeat : 'repeat';
+    if(backgroundImage != null) {
+      tapeDiv.style.backgroundImage = "url(" + backgroundImage + ")";
+      tapeDiv.style.backgroundRepeat = backgroundRepeat;
+    }  
+    
+    SimileAjax.Graphics.setOpacity(tapeDiv, opacity);
+        
+    this._eventLayer.appendChild(tapeDiv);
+    
+    return {
+        left:   startPixel,
+        top:    top,
+        width:  tapeWidth,
+        height: tapeHeight,
+        elmt:   tapeDiv
+    };
+}
+
+Timeline.OriginalEventPainter.prototype._getLabelDivClassName = function(evt) {
+    return this._getElClassName('timeline-event-label', evt, 'label');
+};
+
+Timeline.OriginalEventPainter.prototype._getElClassName = 
function(elClassName, evt, prefix) {
+    // Prefix and '_' is added to the event's classname. Set to null for no 
prefix
+    var evt_classname = evt.getClassName(),
+        pieces = [];
+
+    if (evt_classname) {
+      if (prefix) {pieces.push(prefix + '-' + evt_classname + ' ');}
+      pieces.push(evt_classname + ' ');
+    }
+    pieces.push(elClassName);
+    return(pieces.join(''));
+};
+
+Timeline.OriginalEventPainter.prototype._getHighlightColor = 
function(highlightIndex, theme) {
+    var highlightColors = theme.event.highlightColors;    
+    return highlightColors[Math.min(highlightIndex, highlightColors.length - 
1)];
+};
+
+Timeline.OriginalEventPainter.prototype._createHighlightDiv = 
function(highlightIndex, dimensions, theme, evt) {
+    var div = null;
+    if (highlightIndex >= 0) {
+        var doc = this._timeline.getDocument();        
+        var color = this._getHighlightColor(highlightIndex, theme);
+        
+        div = doc.createElement("div");
+        div.className = this._getElClassName('timeline-event-highlight', evt, 
'highlight');
+        div.id = this._encodeEventElID('highlight0', evt); // in future will 
have other
+                                                           // highlight divs 
for tapes + icons
+        div.style.position = "absolute";
+        div.style.overflow = "hidden";
+        div.style.left =    (dimensions.left - 2) + "px";
+        div.style.width =   (dimensions.width + 4) + "px";
+        div.style.top =     (dimensions.top - 2) + "px";
+        div.style.height =  (dimensions.height + 4) + "px";
+        div.style.background = color;
+        
+        this._highlightLayer.appendChild(div);
+    }
+    return div;
+};
+
+Timeline.OriginalEventPainter.prototype._onClickInstantEvent = function(icon, 
domEvt, evt) {
+    var c = SimileAjax.DOM.getPageCoordinates(icon);
+    this._showBubble(
+        c.left + Math.ceil(icon.offsetWidth / 2), 
+        c.top + Math.ceil(icon.offsetHeight / 2),
+        evt
+    );
+    this._fireOnSelect(evt.getID());
+    
+    domEvt.cancelBubble = true;
+    SimileAjax.DOM.cancelEvent(domEvt);
+    return false;
+};
+
+Timeline.OriginalEventPainter.prototype._onClickDurationEvent = 
function(target, domEvt, evt) {
+    if ("pageX" in domEvt) {
+        var x = domEvt.pageX;
+        var y = domEvt.pageY;
+    } else {
+        var c = SimileAjax.DOM.getPageCoordinates(target);
+        var x = domEvt.offsetX + c.left;
+        var y = domEvt.offsetY + c.top;
+    }
+    this._showBubble(x, y, evt);
+    this._fireOnSelect(evt.getID());
+    
+    domEvt.cancelBubble = true;
+    SimileAjax.DOM.cancelEvent(domEvt);
+    return false;
+};
+
+Timeline.OriginalEventPainter.prototype.showBubble = function(evt) {
+    var elmt = this._eventIdToElmt[evt.getID()];
+    if (elmt) {
+        var c = SimileAjax.DOM.getPageCoordinates(elmt);
+        this._showBubble(c.left + elmt.offsetWidth / 2, c.top + 
elmt.offsetHeight / 2, evt);
+    }
+};
+
+Timeline.OriginalEventPainter.prototype._showBubble = function(x, y, evt) {
+    var div = document.createElement("div");
+    var themeBubble = this._params.theme.event.bubble;
+    evt.fillInfoBubble(div, this._params.theme, this._band.getLabeller());
+    
+    SimileAjax.WindowManager.cancelPopups();
+    SimileAjax.Graphics.createBubbleForContentAndPoint(div, x, y,
+        themeBubble.width, null, themeBubble.maxHeight);
+};
+
+Timeline.OriginalEventPainter.prototype._fireOnSelect = function(eventID) {
+    for (var i = 0; i < this._onSelectListeners.length; i++) {
+        this._onSelectListeners[i](eventID);
+    }
+};
+
+Timeline.OriginalEventPainter.prototype._fireEventPaintListeners = 
function(op, evt, els) {
+    for (var i = 0; i < this._eventPaintListeners.length; i++) {
+        this._eventPaintListeners[i](this._band, op, evt, els);
+    }
+};

Added: 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/overview-painter.js
==============================================================================
--- 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/overview-painter.js
 (added)
+++ 
websites/staging/ooo-site/trunk/content/scripts/simile-widget/timeline/2.3.1/scripts/overview-painter.js
 Wed Apr 12 14:40:22 2017
@@ -0,0 +1,258 @@
+/*==================================================
+ *  Overview Event Painter
+ *==================================================
+ */
+
+Timeline.OverviewEventPainter = function(params) {
+    this._params = params;
+    this._onSelectListeners = [];
+    
+    this._filterMatcher = null;
+    this._highlightMatcher = null;
+};
+
+Timeline.OverviewEventPainter.prototype.initialize = function(band, timeline) {
+    this._band = band;
+    this._timeline = timeline;
+    
+    this._eventLayer = null;
+    this._highlightLayer = null;
+};
+
+Timeline.OverviewEventPainter.prototype.getType = function() {
+    return 'overview';
+};
+
+Timeline.OverviewEventPainter.prototype.addOnSelectListener = 
function(listener) {
+    this._onSelectListeners.push(listener);
+};
+
+Timeline.OverviewEventPainter.prototype.removeOnSelectListener = 
function(listener) {
+    for (var i = 0; i < this._onSelectListeners.length; i++) {
+        if (this._onSelectListeners[i] == listener) {
+            this._onSelectListeners.splice(i, 1);
+            break;
+        }
+    }
+};
+
+Timeline.OverviewEventPainter.prototype.getFilterMatcher = function() {
+    return this._filterMatcher;
+};
+
+Timeline.OverviewEventPainter.prototype.setFilterMatcher = 
function(filterMatcher) {
+    this._filterMatcher = filterMatcher;
+};
+
+Timeline.OverviewEventPainter.prototype.getHighlightMatcher = function() {
+    return this._highlightMatcher;
+};
+
+Timeline.OverviewEventPainter.prototype.setHighlightMatcher = 
function(highlightMatcher) {
+    this._highlightMatcher = highlightMatcher;
+};
+
+Timeline.OverviewEventPainter.prototype.paint = function() {
+    var eventSource = this._band.getEventSource();
+    if (eventSource == null) {
+        return;
+    }
+    
+    this._prepareForPainting();
+    
+    var eventTheme = this._params.theme.event;
+    var metrics = {
+        trackOffset:    eventTheme.overviewTrack.offset,
+        trackHeight:    eventTheme.overviewTrack.height,
+        trackGap:       eventTheme.overviewTrack.gap,
+        trackIncrement: eventTheme.overviewTrack.height + 
eventTheme.overviewTrack.gap
+    }
+    
+    var minDate = this._band.getMinDate();
+    var maxDate = this._band.getMaxDate();
+    
+    var filterMatcher = (this._filterMatcher != null) ? 
+        this._filterMatcher :
+        function(evt) { return true; };
+    var highlightMatcher = (this._highlightMatcher != null) ? 
+        this._highlightMatcher :
+        function(evt) { return -1; };
+    
+    var iterator = eventSource.getEventReverseIterator(minDate, maxDate);
+    while (iterator.hasNext()) {
+        var evt = iterator.next();
+        if (filterMatcher(evt)) {
+            this.paintEvent(evt, metrics, this._params.theme, 
highlightMatcher(evt));
+        }
+    }
+    
+    this._highlightLayer.style.display = "block";
+    this._eventLayer.style.display = "block";
+    // update the band object for max number of tracks in this section of the 
ether
+    this._band.updateEventTrackInfo(this._tracks.length, 
metrics.trackIncrement); 
+};
+
+Timeline.OverviewEventPainter.prototype.softPaint = function() {
+};
+
+Timeline.OverviewEventPainter.prototype._prepareForPainting = function() {
+    var band = this._band;
+        
+    this._tracks = [];
+    
+    if (this._highlightLayer != null) {
+        band.removeLayerDiv(this._highlightLayer);
+    }
+    this._highlightLayer = band.createLayerDiv(105, 
"timeline-band-highlights");
+    this._highlightLayer.style.display = "none";
+    
+    if (this._eventLayer != null) {
+        band.removeLayerDiv(this._eventLayer);
+    }
+    this._eventLayer = band.createLayerDiv(110, "timeline-band-events");
+    this._eventLayer.style.display = "none";
+};
+
+Timeline.OverviewEventPainter.prototype.paintEvent = function(evt, metrics, 
theme, highlightIndex) {
+    if (evt.isInstant()) {
+        this.paintInstantEvent(evt, metrics, theme, highlightIndex);
+    } else {
+        this.paintDurationEvent(evt, metrics, theme, highlightIndex);
+    }
+};
+
+Timeline.OverviewEventPainter.prototype.paintInstantEvent = function(evt, 
metrics, theme, highlightIndex) {
+    var startDate = evt.getStart();
+    var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
+    
+    var color = evt.getColor(),
+        klassName = evt.getClassName();
+    if (klassName) {
+      color = null;
+    } else {
+      color = color != null ? color : theme.event.duration.color;
+    }
+    
+    var tickElmtData = this._paintEventTick(evt, startPixel, color, 100, 
metrics, theme);
+    
+    this._createHighlightDiv(highlightIndex, tickElmtData, theme);
+};
+
+Timeline.OverviewEventPainter.prototype.paintDurationEvent = function(evt, 
metrics, theme, highlightIndex) {
+    var latestStartDate = evt.getLatestStart();
+    var earliestEndDate = evt.getEarliestEnd();
+    
+    var latestStartPixel = 
Math.round(this._band.dateToPixelOffset(latestStartDate));
+    var earliestEndPixel = 
Math.round(this._band.dateToPixelOffset(earliestEndDate));
+    
+    var tapeTrack = 0;
+    for (; tapeTrack < this._tracks.length; tapeTrack++) {
+        if (earliestEndPixel < this._tracks[tapeTrack]) {
+            break;
+        }
+    }
+    this._tracks[tapeTrack] = earliestEndPixel;
+    
+    var color = evt.getColor(),
+        klassName = evt.getClassName();
+    if (klassName) {
+      color = null;
+    } else {
+      color = color != null ? color : theme.event.duration.color;
+    }
+    
+    var tapeElmtData = this._paintEventTape(evt, tapeTrack, latestStartPixel, 
earliestEndPixel,
+      color, 100, metrics, theme, klassName);
+    
+    this._createHighlightDiv(highlightIndex, tapeElmtData, theme);
+};
+
+Timeline.OverviewEventPainter.prototype._paintEventTape = function(
+    evt, track, left, right, color, opacity, metrics, theme, klassName) {
+    
+    var top = metrics.trackOffset + track * metrics.trackIncrement;
+    var width = right - left;
+    var height = metrics.trackHeight;
+    
+    var tapeDiv = this._timeline.getDocument().createElement("div");
+    tapeDiv.className = 'timeline-small-event-tape'
+    if (klassName) {tapeDiv.className += ' small-' + klassName;}
+    tapeDiv.style.left = left + "px";
+    tapeDiv.style.width = width + "px";
+    tapeDiv.style.top = top + "px";
+    tapeDiv.style.height = height + "px";
+    
+    if (color) {
+      tapeDiv.style.backgroundColor = color; // set color here if defined by 
event. Else use css
+    }
+ //   tapeDiv.style.overflow = "hidden";   // now set in css
+ //   tapeDiv.style.position = "absolute";
+    if(opacity<100) SimileAjax.Graphics.setOpacity(tapeDiv, opacity);
+    
+    this._eventLayer.appendChild(tapeDiv);
+    
+    return {
+        left:   left,
+        top:    top,
+        width:  width,
+        height: height,
+        elmt:   tapeDiv
+    };
+}
+
+Timeline.OverviewEventPainter.prototype._paintEventTick = function(
+    evt, left, color, opacity, metrics, theme) {
+    
+    var height = theme.event.overviewTrack.tickHeight;
+    var top = metrics.trackOffset - height;
+    var width = 1;
+    
+    var tickDiv = this._timeline.getDocument().createElement("div");
+         tickDiv.className = 'timeline-small-event-icon'
+    tickDiv.style.left = left + "px";
+    tickDiv.style.top = top + "px";
+  //  tickDiv.style.width = width + "px";
+  //  tickDiv.style.position = "absolute";
+  //  tickDiv.style.height = height + "px";
+  //  tickDiv.style.backgroundColor = color;
+  //  tickDiv.style.overflow = "hidden";
+
+    var klassName = evt.getClassName()
+    if (klassName) {tickDiv.className +=' small-' + klassName};
+       
+    if(opacity<100) {SimileAjax.Graphics.setOpacity(tickDiv, opacity)};
+    
+    this._eventLayer.appendChild(tickDiv);
+    
+    return {
+        left:   left,
+        top:    top,
+        width:  width,
+        height: height,
+        elmt:   tickDiv
+    };
+}
+
+Timeline.OverviewEventPainter.prototype._createHighlightDiv = 
function(highlightIndex, dimensions, theme) {
+    if (highlightIndex >= 0) {
+        var doc = this._timeline.getDocument();
+        var eventTheme = theme.event;
+        
+        var color = eventTheme.highlightColors[Math.min(highlightIndex, 
eventTheme.highlightColors.length - 1)];
+        
+        var div = doc.createElement("div");
+        div.style.position = "absolute";
+        div.style.overflow = "hidden";
+        div.style.left =    (dimensions.left - 1) + "px";
+        div.style.width =   (dimensions.width + 2) + "px";
+        div.style.top =     (dimensions.top - 1) + "px";
+        div.style.height =  (dimensions.height + 2) + "px";
+        div.style.background = color;
+        
+        this._highlightLayer.appendChild(div);
+    }
+};
+
+Timeline.OverviewEventPainter.prototype.showBubble = function(evt) {
+    // not implemented
+};


Reply via email to