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 +};