changeset 18:eb6a0fe69683

added serialize/deserializeLetters(), some refactorings
author Atul Varma <avarma@mozilla.com>
date Tue, 04 May 2010 23:52:45 -0700
parents 1c26d07c71c6
children 9da037cd96fe
files index.html
diffstat 1 files changed, 64 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/index.html	Tue May 04 22:45:46 2010 -0700
+++ b/index.html	Tue May 04 23:52:45 2010 -0700
@@ -161,19 +161,12 @@
 
 $.fn.init.prototype = $.fn;
 
-function makeDraggable(node, matrix) {
+function makeDraggable(node, matrix, event) {
   var startX = 0;
   var startY = 0;
   var currX = 0;
   var currY = 0;
 
-  function updateInfo() {
-    var msg = "";
-    if (isMouseDown)
-      msg = "x: " + matrix.e + "\ny: " + matrix.f;
-    $(node).find(".info").text(msg);
-  }
-
   function move() {
     matrix = matrix.translate(currX - startX, currY - startY);
     node.style.webkitTransform = matrix;
@@ -181,9 +174,21 @@
 
   updateInfo();
 
+  function onDragEnd(event) {
+    event.preventDefault();
+    $(node).removeClass("active");
+  }
+
   if (!isTouchSupported) {
     var isMouseDown;
 
+    function updateInfo() {
+      var msg = "";
+      if (isMouseDown)
+        msg = "x: " + matrix.e + "\ny: " + matrix.f;
+      $(node).find(".info").text(msg);
+    }
+
     function onMouseDown(event) {
       event.preventDefault();
       startX = event.clientX;
@@ -193,7 +198,8 @@
       updateInfo();
     }
 
-    onMouseDown(event);
+    if (event)
+      onMouseDown(event);
 
     $(node).bind("mousedown", onMouseDown);
 
@@ -210,9 +216,8 @@
 
     $(node.ownerDocument).bind("mouseup", function(event) {
       if (isMouseDown) {
-        event.preventDefault();
         isMouseDown = false;
-        $(node).removeClass("active");
+        onDragEnd(event);
         updateInfo();
       }
     });
@@ -221,7 +226,6 @@
       event.preventDefault();
       startX = event.targetTouches[0].pageX;
       startY = event.targetTouches[0].pageY;
-      updateInfo();
       $(this).addClass("active");
     });
 
@@ -232,18 +236,10 @@
       move(this);
       startX = currX;
       startY = currY;
-      updateInfo();
     });
 
-    $(node).bind("touchend", function(event) {
-      event.preventDefault();
-      $(this).removeClass("active");
-    });
-
-    $(node).bind("touchcancel", function(event) {
-      event.preventDefault();
-      $(this).removeClass("active");
-    });
+    $(node).bind("touchend", onDragEnd);
+    $(node).bind("touchcancel", onDragEnd);
   }
 }
 
@@ -273,7 +269,7 @@
       accelerate(event.wheelDelta);
     });
 
-    $(node).find(".letter-prototype").bind("mousedown", makeLetter);
+    $(node).find(".letter-prototype").bind("mousedown", letterFromPalette);
   } else {
     $(node).bind("touchstart", function(event) {
       $(node).removeClass("decelerating");
@@ -305,27 +301,36 @@
         var target = event.changedTouches[0].target;
         if (target.nodeType == target.TEXT_NODE)
           target = target.parentNode;
-        makeLetter.call(target);
+        letterFromPalette.call(target);
       }
     });
   }
 }
 
-function makeLetter(event) {
-  if (event)
-    event.preventDefault();
-
-  var node = this;
-  var doc = this.ownerDocument;
-
+function makeLetter(text, matrix, doc, event) {
   var letter = doc.createElement("div");
-  var char = doc.createTextNode(this.textContent);
+  var char = doc.createTextNode(text);
   var info = doc.createElement("div");
 
   letter.className = "letter";
   info.className = "info";
   letter.appendChild(char);
   letter.appendChild(info);
+  letter.style.webkitTransform = matrix;
+
+  doc.body.appendChild(letter);
+
+  makeDraggable(letter, matrix, event);
+
+  return letter;
+}
+
+function letterFromPalette(event) {
+  if (event)
+    event.preventDefault();
+
+  var node = this;
+  var doc = this.ownerDocument;
 
   // TODO: This assumes things about the DOM structure that
   // we don't want to have to assume.
@@ -338,16 +343,40 @@
     this.offsetTop + parentMatrix.f
   );
 
-  letter.style.webkitTransform = matrix;
-  doc.body.appendChild(letter);
+  var letter = makeLetter(this.textContent, matrix, doc, event);
 
   // Apply a new transform to make the letter animate.
   if (isTouchSupported) {
     matrix = matrix.translate(-this.offsetWidth, 0);
     letter.style.webkitTransform = matrix;
   }
+}
 
-  makeDraggable(letter, matrix);
+function serializeLetters() {
+  var stack = [];
+  $(".letter").each(function() {
+    var letter = this.firstChild.textContent;
+    var matrix = new WebKitCSSMatrix();
+    matrix.setMatrixValue(this.style.webkitTransform);
+    var x = matrix.e;
+    var y = matrix.f;
+    stack = stack.concat([y, x, letter]);
+  });
+  return stack.join("_");
+}
+
+function deserializeLetters(serialized) {
+  var stack = serialized.split("_");
+
+  while (stack.length) {
+    var letter = stack.pop();
+    var x = stack.pop();
+    var y = stack.pop();
+
+    var matrix = new WebKitCSSMatrix();
+    matrix = matrix.translate(x, y);
+    makeLetter(letter, matrix, document);
+  }
 }
 
 function addLetters() {