diff public_html/static/js/implab/sticky.js @ 12:d9551c7e7101

improved dox library
author sergey
date Fri, 16 May 2014 16:47:50 +0400
parents 2d1a0a75fc49
children
line wrap: on
line diff
--- a/public_html/static/js/implab/sticky.js	Thu May 15 18:24:02 2014 +0400
+++ b/public_html/static/js/implab/sticky.js	Fri May 16 16:47:50 2014 +0400
@@ -1,49 +1,88 @@
 define([ 'dojo/on', 'dojo/dom-geometry', 'dojo/dom-style' ], function(on, g,
 		css) {
 
+	/**
+	 * @param [Dom|string]
+	 *            stiker element to become a sticker
+	 */
 	return function(sticker, options) {
 		var dh, pos;
 
-		var pos = g.position(sticker,true);
+		var pos = g.position(sticker, true);
+		var clientWidth = g.position(document.body).w;
+		var stickRight = options ? options.stick == 'right' : false;
 
-		var origLeft = css.get(sticker,'left');
-		var left = pos.x + 'px';
+		var origPos = css.get(sticker, stickRight ? 'right' : 'left');
+
+		var fixPos = (stickRight ? clientWidth - pos.w - pos.x : pos.x) + 'px';
 
-		if (options && options.along) {
-			var along = g.position(options.along,true);
-			dh = along.y + along.h - pos.h - pos.y;
-		} else {
-			dh = window.scrollMaxY - pos.h - pos.y;
-		}
+		var dhcalc = function() {
+			if (options && options.along) {
+				var along = g.position(options.along, true);
+				dh = along.y + along.h - pos.h - pos.y;
+				if (options.alongContent)
+					// respect bottom padding and border
+					dh -= g.getPadExtents(options.along).t
+							+ g.getBorderExtents(options.along).t;
+			} else {
+				dh = window.scrollMaxY - pos.h - pos.y;
+			}
+		};
 
 		var fixed = false;
-		
+
 		var stfn = function() {
-			if(!options || !options.along)
+			if (!options || !options.along)
 				dh = window.scrollMaxY - pos.h - pos.y;
 
 			if (window.scrollY >= pos.y && window.scrollY <= pos.y + dh) {
 				if (!fixed) {
-					css.set(sticker, { top : 0, left: left, position : 'fixed' });
+					if (stickRight)
+						css.set(sticker, {
+							top : 0,
+							right : fixPos,
+							position : 'fixed'
+						});
+					else
+						css.set(sticker, {
+							top : 0,
+							left : fixPos,
+							position : 'fixed'
+						});
 					fixed = true;
 				}
 			} else {
 				if (fixed) {
 					fixed = false;
-					
-					css.set(sticker, { position : 'relative', left: origLeft });
+
+					if (stickRight)
+						css.set(sticker, {
+							position : 'relative',
+							right : origPos
+						});
+					else
+						css.set(sticker, {
+							position : 'relative',
+							left : origPos
+						});
 
 					if (window.scrollY < pos.y) {
-						css.set(sticker, { top : 'auto' });
+						css.set(sticker, {
+							top : 'auto'
+						});
 					} else {
-						css.set(sticker, { top : dh + 'px' });
+						css.set(sticker, {
+							top : dh + 'px'
+						});
 					}
 				}
 			}
 		};
-		
+
+		dhcalc();
 		stfn();
 
-		on(window, 'scroll', stfn );
+		on(window, 'scroll', stfn);
+		on(window, 'resize', dhcalc);
 	};
 });
\ No newline at end of file