You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.9 KiB
200 lines
5.9 KiB
/*
|
|
YUI 3.17.2 (build 9c3c78e)
|
|
Copyright 2014 Yahoo! Inc. All rights reserved.
|
|
Licensed under the BSD License.
|
|
http://yuilibrary.com/license/
|
|
*/
|
|
|
|
YUI.add('align-plugin', function (Y, NAME) {
|
|
|
|
/**
|
|
* Provides advanced positioning support for Node via a Plugin
|
|
* for centering and alignment.
|
|
* @module align-plugin
|
|
*/
|
|
|
|
var OFFSET_WIDTH = 'offsetWidth',
|
|
OFFSET_HEIGHT = 'offsetHeight',
|
|
undefined = undefined;
|
|
|
|
/**
|
|
* Node plugin which can be used to align a node with another node,
|
|
* region, or the viewport.
|
|
*
|
|
* @class Plugin.Align
|
|
* @param {Object} User configuration object
|
|
*/
|
|
function Align(config) {
|
|
if (config.host) {
|
|
this._host = config.host;
|
|
}
|
|
}
|
|
|
|
Align.prototype = {
|
|
/**
|
|
* Aligns node with a point on another node or region.
|
|
* Possible alignment points are:
|
|
* <dl>
|
|
* <dt>tl</dt>
|
|
* <dd>top left</dd>
|
|
* <dt>tr</dt>
|
|
* <dd>top right</dd>
|
|
* <dt>bl</dt>
|
|
* <dd>bottom left</dd>
|
|
* <dt>br</dt>
|
|
* <dd>bottom right</dd>
|
|
* <dt>tc</dt>
|
|
* <dd>top center</dd>
|
|
* <dt>bc</dt>
|
|
* <dd>bottom center</dd>
|
|
* <dt>rc</dt>
|
|
* <dd>right center</dd>
|
|
* <dt>lc</dt>
|
|
* <dd>left center</dd>
|
|
* <dt>cc</dt>
|
|
* <dd>center center</dd>
|
|
* </dl>
|
|
* @method to
|
|
* @param region {String|Node|HTMLElement|Object} The node or
|
|
* region to align with. Defaults to the viewport region.
|
|
* @param regionPoint {String} The point of the region to align with.
|
|
* @param point {String} The point of the node aligned to the region.
|
|
* @param resize {Boolean} Whether or not the node should re-align when
|
|
* the window is resized. Defaults to false.
|
|
*/
|
|
to: function(region, regionPoint, point, syncOnResize) {
|
|
// cache original args for syncing
|
|
this._syncArgs = Y.Array(arguments);
|
|
|
|
if (region.top === undefined) {
|
|
region = Y.one(region).get('region');
|
|
}
|
|
|
|
if (region) {
|
|
var xy = [region.left, region.top],
|
|
offxy = [region.width, region.height],
|
|
points = Align.points,
|
|
node = this._host,
|
|
NULL = null,
|
|
size = node.getAttrs([OFFSET_HEIGHT, OFFSET_WIDTH]),
|
|
nodeoff = [0 - size[OFFSET_WIDTH], 0 - size[OFFSET_HEIGHT]], // reverse offsets
|
|
regionFn0 = regionPoint ? points[regionPoint.charAt(0)]: NULL,
|
|
regionFn1 = (regionPoint && regionPoint !== 'cc') ? points[regionPoint.charAt(1)] : NULL,
|
|
nodeFn0 = point ? points[point.charAt(0)] : NULL,
|
|
nodeFn1 = (point && point !== 'cc') ? points[point.charAt(1)] : NULL;
|
|
|
|
if (regionFn0) {
|
|
xy = regionFn0(xy, offxy, regionPoint);
|
|
}
|
|
if (regionFn1) {
|
|
xy = regionFn1(xy, offxy, regionPoint);
|
|
}
|
|
|
|
if (nodeFn0) {
|
|
xy = nodeFn0(xy, nodeoff, point);
|
|
}
|
|
if (nodeFn1) {
|
|
xy = nodeFn1(xy, nodeoff, point);
|
|
}
|
|
|
|
if (xy && node) {
|
|
node.setXY(xy);
|
|
}
|
|
|
|
this._resize(syncOnResize);
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
sync: function() {
|
|
this.to.apply(this, this._syncArgs);
|
|
return this;
|
|
},
|
|
|
|
_resize: function(add) {
|
|
var handle = this._handle;
|
|
if (add && !handle) {
|
|
this._handle = Y.on('resize', this._onresize, window, this);
|
|
} else if (!add && handle) {
|
|
handle.detach();
|
|
}
|
|
|
|
},
|
|
|
|
_onresize: function() {
|
|
var self = this;
|
|
setTimeout(function() { // for performance
|
|
self.sync();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Aligns the center of a node to the center of another node or region.
|
|
* @method center
|
|
* @param region {Node|HTMLElement|Object} optional The node or
|
|
* region to align with. Defaults to the viewport region.
|
|
* the window is resized. If centering to viewport, this defaults
|
|
* to true, otherwise default is false.
|
|
*/
|
|
center: function(region, resize) {
|
|
this.to(region, 'cc', 'cc', resize);
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Removes the resize handler, if any. This is called automatically
|
|
* when unplugged from the host node.
|
|
* @method destroy
|
|
*/
|
|
destroy: function() {
|
|
var handle = this._handle;
|
|
if (handle) {
|
|
handle.detach();
|
|
}
|
|
}
|
|
};
|
|
|
|
Align.points = {
|
|
't': function(xy, off) {
|
|
return xy;
|
|
},
|
|
|
|
'r': function(xy, off) {
|
|
return [xy[0] + off[0], xy[1]];
|
|
},
|
|
|
|
'b': function(xy, off) {
|
|
return [xy[0], xy[1] + off[1]];
|
|
},
|
|
|
|
'l': function(xy, off) {
|
|
return xy;
|
|
},
|
|
|
|
'c': function(xy, off, point) {
|
|
var axis = (point[0] === 't' || point[0] === 'b') ? 0 : 1,
|
|
ret, val;
|
|
|
|
if (point === 'cc') {
|
|
ret = [xy[0] + off[0] / 2, xy[1] + off[1] / 2];
|
|
} else {
|
|
val = xy[axis] + off[axis] / 2;
|
|
ret = (axis) ? [xy[0], val] : [val, xy[1]];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
};
|
|
|
|
Align.NAME = 'Align';
|
|
Align.NS = 'align';
|
|
|
|
Align.prototype.constructor = Align;
|
|
|
|
Y.namespace('Plugin');
|
|
Y.Plugin.Align = Align;
|
|
|
|
|
|
|
|
}, '3.17.2', {"requires": ["node-screen", "node-pluginhost"]});
|
|
|