r2870 - positionTo: first prototype for collision detection: renamed option to "collision", imple...

r2870 - positionTo: first prototype for collision detection: renamed option to "collision", imple...


Author: joern.zaefferer
Date: Sun Jul 5 11:11:39 2009
New Revision: 2870
Modified:
branches/dev/positionTo/demos/positionTo/default.html
branches/dev/positionTo/ui/ui.positionTo.js
Log:
positionTo: first prototype for collision detection: renamed option
to "collision", implemented fit and modified default demo to use fit
(instead of default flip)
Modified: branches/dev/positionTo/demos/positionTo/default.html
==============================================================================
--- branches/dev/positionTo/demos/positionTo/default.html    (original)
+++ branches/dev/positionTo/demos/positionTo/default.html    Sun Jul 5
11:11:39 2009
@@ -49,7 +49,9 @@
my: $('#my_horizontal').val() + ' ' +
$('#my_vertical').val(),
at: $('#at_horizontal').val() + ' '+
$('#at_vertical').val(),
offset: $('#offset').val(),
-                by: by
+                by: by,
+                // for testing only, remove once fully implemented
+                collision: "fit"
});
        }
        
@@ -93,7 +95,7 @@

</div>
-<div class="positionable" style="width:90px; height: 60px;">
+<div class="positionable" style="width:120px; height: 40px;">


to position 2



Modified: branches/dev/positionTo/ui/ui.positionTo.js
==============================================================================
--- branches/dev/positionTo/ui/ui.positionTo.js    (original)
+++ branches/dev/positionTo/ui/ui.positionTo.js    Sun Jul 5 11:11:39 2009
@@ -16,7 +16,7 @@
$.fn.positionTo = function(options) {
    options = $.extend({
-        collisionDetect: 'flip',
+        collision: 'flip',
        stackFix: true
    }, options);
@@ -58,6 +58,14 @@
        pos[1] = verticalPositions.test(pos[1]) ? pos[1] : verticalDefault;
        options[this] = pos;
    });
+    
+    // normalize collision option
+    if (options.collision) {
+        var collision = options.collision.split(' ');
+        options.collision = collision.length == 1
+            ? [collision[0], collision[0]]
+            : collision
+    }
    switch (options.at[0]) {
        case 'right':
@@ -106,7 +114,35 @@
                break;
        }
-        // TODO: collision option
+        // TODO fit breaks when the window scrolls; need to take scrollLeft/Top
into account
+        if (options.collision) {
+            if (options.collision[0] != "none") {
+                var over = (position.left + elemWidth) - $(window).width();
+                if (over > 0) {
+                    switch(options.collision[0]) {
+                    case 'fit':
+                        position.left -= over;
+                        break;
+                    case 'flip':
+                        // TODO not yet implemented
+                        break;
+                    }
+                }
+            }
+            if (options.collision[1] != "none") {
+                var over = (position.top + elemHeight) - $(window).height();
+                if (over > 0) {
+                    switch(options.collision[1]) {
+                    case 'fit':
+                        position.top -= over;
+                        break;
+                    case 'flip':
+                        // TODO not yet implemented
+                        break;
+                    }
+                }
+            }
+        }
        (options.stackfix && $.fn.stackfix && elem.stackfix());
        // the by function is passed the offset values, not the position values