RTL Timeline for Arabic language
authorveltr
Wed, 25 Sep 2013 12:47:19 +0200
changeset 117 18b5748069f7
parent 116 04791c6330b8
child 118 3d102aed3213
RTL Timeline for Arabic language
src/jocondelab/static/jocondelab/js/front-timeline.js
--- a/src/jocondelab/static/jocondelab/js/front-timeline.js	Wed Sep 25 12:44:50 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-timeline.js	Wed Sep 25 12:47:19 2013 +0200
@@ -6,7 +6,7 @@
         zoomLevel = 4,
         zoomStep = Math.SQRT2,
         minZoomLevel = 1,
-        maxZoomLevel = 64,
+        maxZoomLevel = 256,
         sliderWidth = 3000,
         $slider = $(".timeline-mill-slider"),
         $tlcontainer = $(".timeline-container"),
@@ -17,7 +17,8 @@
         itemCount = 12,
         tlCache = [], tlIdCache = [], currentTerm = null,
         startSlide = startYear, endSlide = endYear, userStartSlide = startSlide, userEndSlide = endSlide,
-        fromYear, toYear;
+        fromYear, toYear,
+        isRtl = $("html").is("[dir=rtl]");
     
     function tToW(t) {
         //return Math.pow(2 / (2-Math.min(1,Math.max(0,t))) - 1,gamma);
@@ -40,28 +41,40 @@
         return tToW(yrToT(yr));
     }
     function deltaXToDeltaW(dx) {
-        return dx / (zoomLevel * cWidth);
+        return (isRtl ? -1 : 1) * dx / (zoomLevel * cWidth);
     }
     function deltaWToDeltaX(dw) {
-        return dw * zoomLevel * cWidth;
+        return (isRtl ? -1 : 1) * dw * zoomLevel * cWidth;
     }
     function wToX(w) {
-        return deltaWToDeltaX(w - wCenter + (.5 / zoomLevel));
+        return (isRtl ? cWidth : 0) + deltaWToDeltaX(w - wCenter + (.5 / zoomLevel));
     }
     function xToW(x) {
-        return deltaXToDeltaW(x) + wCenter - (.5 / zoomLevel);
+        return deltaXToDeltaW(x - (isRtl ? cWidth : 0)) + wCenter - (.5 / zoomLevel);
     }
     function wToMini(w) {
-        return cWidth * w;
+        var res = cWidth * w;
+        if (isRtl) {
+            res = cWidth - res;
+        }
+        return res;
     }
-    function miniToW(m) {
-        return m / cWidth;
+    function deltaMiniToDeltaW(m) {
+        return (isRtl ? -1 : 1) * m / cWidth;
     }
     function wToSlider(w) {
-        return zoomLevel * sliderWidth * (w - wCenter + (.5 / zoomLevel));
+        var res = zoomLevel * sliderWidth * (w - wCenter + (.5 / zoomLevel));
+        if (isRtl) {
+            res = sliderWidth - res;
+        }
+        return res;
     }
     function sliderToW(slidepos) {
-        return slidepos / (sliderWidth * zoomLevel) + wCenter - (.5 / zoomLevel);
+        var p = slidepos;
+        if (isRtl) {
+            p = sliderWidth - p;
+        }
+        return p / (sliderWidth * zoomLevel) + wCenter - (.5 / zoomLevel);
     }
     function yrToMiniX(yr) {
         return wToMini(yrToW(yr));
@@ -85,16 +98,23 @@
         wLineDist = null;
         fromYear = wToYr(wCenter - .5 / zoomLevel);
         toYear = wToYr(wCenter + .5 / zoomLevel);
-        var yearAtQuarter = wToYr(wCenter - .25 / zoomLevel);
+        var wAtQuarter = (wCenter - .25 /zoomLevel),
+            yearAtQuarter = wToYr(wAtQuarter),
+            posAtQuarter = wToX(wAtQuarter);
         for (var i = 0; i < lineDistances.length; i++) {
-            if (yrToX(yearAtQuarter + lineDistances[i]) - cWidth / 4 < 50) {
+            var yr = yearAtQuarter + lineDistances[i],
+                x = yrToX(yr),
+                delta = x - posAtQuarter;
+            if (Math.abs(delta) < 50) {
                 break;
             }
             wLineDist = lineDistances[i];
         }
         startSlide = boundValue(userStartSlide);
         endSlide = boundValue(userEndSlide);
-        $slider.slider("values",[yrToSliderPos(startSlide),yrToSliderPos(endSlide)]);
+        var startPos = yrToSliderPos(startSlide),
+            endPos = yrToSliderPos(endSlide);
+        $slider.slider("values",[Math.min(startPos, endPos),Math.max(startPos, endPos)]);
         updateSpans();
     }
     
@@ -111,18 +131,20 @@
         var ctx = canvas.getContext("2d");
         
         var xstart = yrToMiniX(fromYear),
-            xend = yrToMiniX(toYear);
+            xend = yrToMiniX(toYear),
+            xleft = Math.min(xstart, xend),
+            xright = Math.max(xstart, xend);
         ctx.fillStyle = "#f0f2ff";
         ctx.strokeStyle = "#3090ff";
         ctx.beginPath();
-        ctx.moveTo(xstart, 0);
-        ctx.lineTo(xend, 0);
-        ctx.lineTo(xend, 35);
+        ctx.moveTo(xleft, 0);
+        ctx.lineTo(xright, 0);
+        ctx.lineTo(xright, 35);
         ctx.lineTo(cWidth, 70);
         ctx.lineTo(cWidth, cHeight);
         ctx.lineTo(0, cHeight);
         ctx.lineTo(0, 70);
-        ctx.lineTo(xstart, 35);
+        ctx.lineTo(xleft, 35);
         ctx.closePath();
         ctx.stroke();
         ctx.fill();
@@ -141,7 +163,7 @@
             ctx.moveTo(x,24);
             ctx.lineTo(x,30);
             ctx.stroke();
-            ctx.textAlign = (i ? (i == miniLines.length - 1 ? "right" : "center") : "left" );
+            ctx.textAlign = (i ? (i == miniLines.length - 1 ? (isRtl ? "left" : "right" ) : "center") : (isRtl ? "right" : "left" ) );
             ctx.fillText(y || 1, x,20);
         }
         ctx.textAlign = 'center';
@@ -171,8 +193,8 @@
                 return itemTpl({
                     current: (item.dbpedia_uri == currentTerm),
                     item: item,
-                    left: l,
-                    width: (r-l)
+                    left: Math.min(l,r),
+                    width: Math.abs(r-l)
                 });
             }).value().join("");
         $(".timeline-list").html(html);
@@ -233,7 +255,7 @@
                 Math.min(
                     1 - halfSpan,
                     dragmini ?
-                        (wcStart + miniToW(e.clientX - xstart)) :
+                        (wcStart + deltaMiniToDeltaW(e.clientX - xstart)) :
                         (wcStart + deltaXToDeltaW(xstart - e.clientX))
                     )
                 );
@@ -278,8 +300,10 @@
         max: sliderWidth,
         values: [0, sliderWidth],
         slide: function(e, ui) {
-            userStartSlide = startSlide = Math.floor(sliderPosToYr(ui.values[0]));
-            userEndSlide = endSlide = Math.floor(sliderPosToYr(ui.values[1]));
+            var y0 = Math.floor(sliderPosToYr(ui.values[0])),
+                y1 = Math.floor(sliderPosToYr(ui.values[1]));
+            userStartSlide = startSlide = Math.min(y0,y1);
+            userEndSlide = endSlide = Math.max(y0,y1);
             updateSpans();
         }
     });