b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgrenvar Lang = Y.Lang,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isBoolean = Lang.isBoolean,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isNumber = Lang.isNumber,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isString = Lang.isString,
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren capitalize = Y.Resize.capitalize,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren isNode = function(v) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren return (v instanceof Y.Node);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren },
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren toNumber = function(num) {
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren return parseFloat(num) || 0;
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren },
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo 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',
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren BORDER = 'border',
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',
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren WIDTH = 'width',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren VIEW = 'view',
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren VIEWPORT_REGION = 'viewportRegion';
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass/**
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav GlassA Resize plugin that will attempt to constrain the resize node to the boundaries.
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@module resize
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@submodule resize-contrain
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@class ResizeConstrained
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@param config {Object} Object literal specifying widget configuration properties.
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@constructor
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@extends Plugin.Base
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass@namespace Plugin
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass*/
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass
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
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav Glass * @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 /**
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren * Stores the <code>constrain</code>
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren * surrounding information retrieved from
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren * <a href="Resize.html#method__getBoxSurroundingInfo">_getBoxSurroundingInfo</a>.
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren *
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren * @property constrainSurrounding
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren * @type Object
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren * @default null
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren */
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren constrainSurrounding: null,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren initializer: function() {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren var instance = this,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren host = instance.get(HOST);
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,
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren constrainBorders = instance.constrainSurrounding.border,
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren region = instance._getConstrainRegion();
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (region) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point1 = info[axis] + info[offset];
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren point1Constrain = region[axisConstrain] - toNumber(constrainBorders[capitalize(BORDER, axisConstrain, WIDTH)]);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren if (point1 >= point1Constrain) {
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren info[offset] -= (point1 - point1Constrain);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren point2 = info[axis];
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren point2Constrain = region[axis] + toNumber(constrainBorders[capitalize(BORDER, axis, WIDTH)]);
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,
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren maxHeight = (instance.get(MAX_HEIGHT) + host.totalVSurrounding),
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren minHeight = (instance.get(MIN_HEIGHT) + host.totalVSurrounding);
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();
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren constrainBorders = instance.constrainSurrounding.border;
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren bottomDiff = (constrainRegion.bottom - toNumber(constrainBorders[BORDER_BOTTOM_WIDTH])) - oBottom;
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren leftDiff = oLeft - (constrainRegion.left + toNumber(constrainBorders[BORDER_LEFT_WIDTH]));
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren rightDiff = (constrainRegion.right - toNumber(constrainBorders[BORDER_RIGHT_WIDTH])) - oRight;
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren topDiff = oTop - (constrainRegion.top + toNumber(constrainBorders[BORDER_TOP_WIDTH]));
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,
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren maxWidth = (instance.get(MAX_WIDTH) + host.totalHSurrounding),
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren minWidth = (instance.get(MIN_WIDTH) + host.totalHSurrounding);
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 constrain = instance.get(CONSTRAIN),
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren host = instance.get(HOST);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
a065da42395a1ca913eb21bb85fef51b66eb7d59Eduardo Lundgren instance.constrainSurrounding = host._getBoxSurroundingInfo(constrain);
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren }
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren});
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo Lundgren
b451f8781c6f461e76013de8c464ba9c26c37161Eduardo LundgrenY.namespace('Plugin');
99a0f1980cb492371b8d8ce039c7d14b93f115f4Dav GlassY.Plugin.ResizeConstrained = ResizeConstrained;