resize-constrain.js revision b451f8781c6f461e76013de8c464ba9c26c37161
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgrenvar Lang = Y.Lang,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isBoolean = Lang.isBoolean,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isNumber = Lang.isNumber,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isString = Lang.isString,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isNode = function(v) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return (v instanceof Y.Node);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren BORDER_BOTTOM_WIDTH = 'borderBottomWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren BORDER_LEFT_WIDTH = 'borderLeftWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren BORDER_RIGHT_WIDTH = 'borderRightWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren BORDER_TOP_WIDTH = 'borderTopWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren BOTTOM = 'bottom',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren CON = 'con',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren CONSTRAIN = 'constrain',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren HOST = 'host',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren LEFT = 'left',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren MAX_HEIGHT = 'maxHeight',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren MAX_WIDTH = 'maxWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren MIN_HEIGHT = 'minHeight',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren MIN_WIDTH = 'minWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren NODE = 'node',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren OFFSET_HEIGHT = 'offsetHeight',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren OFFSET_WIDTH = 'offsetWidth',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren PRESEVE_RATIO = 'preserveRatio',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren REGION = 'region',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren RESIZE_CONTRAINED = 'resizeConstrained',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren RIGHT = 'right',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren TICK_X = 'tickX',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren TICK_Y = 'tickY',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren TOP = 'top',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren VIEW = 'view',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren VIEWPORT_REGION = 'viewportRegion';
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgrenfunction ResizeConstrained() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren ResizeConstrained.superclass.constructor.apply(this, arguments);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren}
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo LundgrenY.mix(ResizeConstrained, {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren NAME: RESIZE_CONTRAINED,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren NS: CON,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren ATTRS: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Will attempt to constrain the resize node to the boundaries. Arguments:<br>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * 'view': Contrain to Viewport<br>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * '#selector_string': Constrain to this node<br>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * '{Region Object}': An Object Literal containing a valid region (top, right, bottom, left) of page positions
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute constrain
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type {String/Object/Node}
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrain: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren setter: function(v) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (v && (isNode(v) || isString(v) || v.nodeType)) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren v = Y.one(v);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return v;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The minimum height of the element
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute minHeight
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default 15
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren minHeight: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: 15,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren validator: isNumber
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The minimum width of the element
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute minWidth
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default 15
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren minWidth: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: 15,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren validator: isNumber
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The maximum height of the element
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute maxHeight
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default Infinity
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren maxHeight: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: Infinity,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren validator: isNumber
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The maximum width of the element
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute maxWidth
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default Infinity
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren maxWidth: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: Infinity,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren validator: isNumber
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Maintain the element's ratio when resizing.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute preserveRatio
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type boolean
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren preserveRatio: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: false,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren validator: isBoolean
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The number of x ticks to span the resize to.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute tickX
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number | false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren tickX: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * The number of y ticks to span the resize to.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @attribute tickY
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Number | false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren tickY: {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren value: false
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren});
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo LundgrenY.extend(ResizeConstrained, Y.Plugin.Base, {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Cache the border widths of the contrain node if constrain
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * option is being used.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @property constrainBorderInfo
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @default {}
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Object
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrainBorderInfo: null,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren initializer: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance.constrainBorderInfo = {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren bottom: 0,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren left: 0,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren right: 0,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren top: 0
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren };
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host.delegate.dd.plug(
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren Y.Plugin.DDConstrained,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren tickX: instance.get(TICK_X),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren tickY: instance.get(TICK_Y)
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren );
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host.after('resize:align', Y.bind(instance._handleResizeAlignEvent, instance));
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host.on('resize:start', Y.bind(instance._handleResizeStartEvent, instance));
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Helper method to update the current values on
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * <a href="Resize.html#property_info">info</a> to respect the
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * constrain node.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _checkConstrain
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @param {String} axis 'top' or 'left'
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @param {String} axisConstrain 'bottom' or 'right'
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @param {String} offset 'offsetHeight' or 'offsetWidth'
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _checkConstrain: function(axis, axisConstrain, offset) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point1,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point1Constrain,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point2,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point2Constrain,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info = host.info,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = instance._getConstrainRegion();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (region) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point1 = info[axis] + info[offset];
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point1Constrain = region[axisConstrain] - instance.constrainBorderInfo[axisConstrain];
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (point1 >= point1Constrain) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info[offset] -= (point1 - point1Constrain);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point2 = info[axis];
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point2Constrain = region[axis] + instance.constrainBorderInfo[axis];
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (point2 <= point2Constrain) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info[axis] += (point2Constrain - point2);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info[offset] -= (point2Constrain - point2);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Update the current values on <a href="Resize.html#property_info">info</a>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * to respect the maxHeight and minHeight.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _checkHeight
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _checkHeight: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info = host.info,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren maxHeight = instance.get(MAX_HEIGHT),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren minHeight = instance.get(MIN_HEIGHT);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkConstrain(TOP, BOTTOM, OFFSET_HEIGHT);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (info.offsetHeight > maxHeight) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host._checkSize(OFFSET_HEIGHT, maxHeight);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (info.offsetHeight < minHeight) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host._checkSize(OFFSET_HEIGHT, minHeight);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Update the current values on <a href="Resize.html#property_info">info</a>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * calculating the correct ratio for the other values.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _checkRatio
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _checkRatio: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info = host.info,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren originalInfo = host.originalInfo,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oWidth = originalInfo.offsetWidth,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oHeight = originalInfo.offsetHeight,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oTop = originalInfo.top,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oLeft = originalInfo.left,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oBottom = originalInfo.bottom,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren oRight = originalInfo.right,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // wRatio/hRatio functions keep the ratio information always synced with the current info information
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // RETURN: percentage how much width/height has changed from the original width/height
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren wRatio = function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return (info.offsetWidth/oWidth);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren hRatio = function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return (info.offsetHeight/oHeight);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isClosestToHeight = host.changeHeightHandles,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren bottomDiff,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrainBorders,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrainRegion,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren leftDiff,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren rightDiff,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren topDiff;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // check whether the resizable node is closest to height or not
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (instance.get(CONSTRAIN) && host.changeHeightHandles && host.changeWidthHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrainRegion = instance._getConstrainRegion();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrainBorders = instance.constrainBorderInfo;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren bottomDiff = (constrainRegion.bottom - constrainBorders.bottom) - oBottom;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren leftDiff = oLeft - (constrainRegion.left + constrainBorders.left);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren rightDiff = (constrainRegion.right - constrainBorders.right) - oRight;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren topDiff = oTop - (constrainRegion.top + constrainBorders.top);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (host.changeLeftHandles && host.changeTopHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isClosestToHeight = (topDiff < leftDiff);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else if (host.changeLeftHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isClosestToHeight = (bottomDiff < leftDiff);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else if (host.changeTopHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isClosestToHeight = (topDiff < rightDiff);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isClosestToHeight = (bottomDiff < rightDiff);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // when the height of the resizable element touch the border of the constrain first
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // force the offsetWidth to be calculated based on the height ratio
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (isClosestToHeight) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.offsetWidth = oWidth*hRatio();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkWidth();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.offsetHeight = oHeight*wRatio();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.offsetHeight = oHeight*wRatio();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkHeight();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.offsetWidth = oWidth*hRatio();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // fixing the top on handles which are able to change top
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // the idea here is change the top based on how much the height has changed instead of follow the dy
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (host.changeTopHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.top = oTop + (oHeight - info.offsetHeight);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // fixing the left on handles which are able to change left
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // the idea here is change the left based on how much the width has changed instead of follow the dx
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (host.changeLeftHandles) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info.left = oLeft + (oWidth - info.offsetWidth);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // rounding values to avoid pixel jumpings
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren Y.each(info, function(value, key) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (isNumber(value)) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info[key] = Math.round(value);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren });
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Check whether the resizable node is inside the constrain region.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _checkRegion
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @return {boolean}
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _checkRegion: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = instance._getConstrainRegion();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return Y.DOM.inRegion(null, region, true, host.info);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Update the current values on <a href="Resize.html#property_info">info</a>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * to respect the maxWidth and minWidth.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _checkWidth
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _checkWidth: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info = host.info,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren maxWidth = instance.get(MAX_WIDTH),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren minWidth = instance.get(MIN_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkConstrain(LEFT, RIGHT, OFFSET_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (info.offsetWidth < minWidth) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host._checkSize(OFFSET_WIDTH, minWidth);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (info.offsetWidth > maxWidth) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host._checkSize(OFFSET_WIDTH, maxWidth);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Get the constrain region based on the <code>constrain</code>
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * attribute.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _getConstrainRegion
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @protected
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @return {Object Region}
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _getConstrainRegion: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren node = host.get(NODE),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrain = instance.get(CONSTRAIN),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = null;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (constrain) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (constrain == VIEW) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = node.get(VIEWPORT_REGION);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else if (isNode(constrain)) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = constrain.get(REGION);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren else {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = constrain;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return region;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _handleResizeAlignEvent: function(event) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // check the max/min height and locking top when these values are reach
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkHeight();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // check the max/min width and locking left when these values are reach
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkWidth();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren // calculating the ratio, for proportionally resizing
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (instance.get(PRESEVE_RATIO)) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._checkRatio();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (instance.get(CONSTRAIN) && !instance._checkRegion()) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host.info = host.lastInfo;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _handleResizeStartEvent: function(event) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance._updateConstrainBorderInfo();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren /**
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * Update <code>instance.constrainBorderInfo</code> values (bottom,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * left, top, right).
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @method _updateConstrainBorderInfo
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @private
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren _updateConstrainBorderInfo: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren constrain = instance.get(CONSTRAIN),
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren getStyle;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (isNode(constrain)) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren getStyle = function(val) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return parseFloat(constrain.getStyle(val)) || 0;
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren };
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance.constrainBorderInfo.bottom = getStyle(BORDER_BOTTOM_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance.constrainBorderInfo.left = getStyle(BORDER_LEFT_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance.constrainBorderInfo.right = getStyle(BORDER_RIGHT_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren instance.constrainBorderInfo.top = getStyle(BORDER_TOP_WIDTH);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren});
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo LundgrenY.namespace('Plugin');
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo LundgrenY.Plugin.ResizeConstrained = ResizeConstrained;