2 * Interface Elements for jQuery
5 * http://interface.eyecon.ro
7 * Copyright (c) 2006 Stefan Petre
8 * Dual licensed under the MIT (MIT-LICENSE.txt)
9 * and GPL (GPL-LICENSE.txt) licenses.
16 resizeDirection: null,
22 * internal: Start function
24 startDrag: function(e) {
25 jQuery.iResize.dragged = (this.dragEl) ? this.dragEl: this;
26 jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
29 jQuery.iResize.sizes = {
30 width: parseInt(jQuery(jQuery.iResize.dragged).css('width')) || 0,
31 height: parseInt(jQuery(jQuery.iResize.dragged).css('height')) || 0
34 // Save original position
35 jQuery.iResize.position = {
36 top: parseInt(jQuery(jQuery.iResize.dragged).css('top')) || 0,
37 left: parseInt(jQuery(jQuery.iResize.dragged).css('left')) || 0
40 // Assign event handlers
42 .bind('mousemove', jQuery.iResize.moveDrag)
43 .bind('mouseup', jQuery.iResize.stopDrag);
46 if (typeof jQuery.iResize.dragged.resizeOptions.onDragStart === 'function') {
47 jQuery.iResize.dragged.resizeOptions.onDragStart.apply(jQuery.iResize.dragged);
52 * internal: Stop function
54 stopDrag: function(e) {
55 // Unbind event handlers
57 .unbind('mousemove', jQuery.iResize.moveDrag)
58 .unbind('mouseup', jQuery.iResize.stopDrag);
61 if (typeof jQuery.iResize.dragged.resizeOptions.onDragStop === 'function') {
62 jQuery.iResize.dragged.resizeOptions.onDragStop.apply(jQuery.iResize.dragged);
65 // Remove dragged element
66 jQuery.iResize.dragged = null;
69 * internal: Move function
71 moveDrag: function(e) {
72 if (!jQuery.iResize.dragged) {
76 pointer = jQuery.iUtil.getPointer(e);
78 // Calculate new positions
79 newTop = jQuery.iResize.position.top - jQuery.iResize.pointer.y + pointer.y;
80 newLeft = jQuery.iResize.position.left - jQuery.iResize.pointer.x + pointer.x;
82 Math.min(newTop, jQuery.iResize.dragged.resizeOptions.maxBottom - jQuery.iResize.sizes.height),
83 jQuery.iResize.dragged.resizeOptions.minTop
86 Math.min(newLeft, jQuery.iResize.dragged.resizeOptions.maxRight- jQuery.iResize.sizes.width),
87 jQuery.iResize.dragged.resizeOptions.minLeft
91 if (typeof jQuery.iResize.dragged.resizeOptions.onDrag === 'function') {
92 var newPos = jQuery.iResize.dragged.resizeOptions.onDrag.apply(jQuery.iResize.dragged, [newLeft, newTop]);
93 if (typeof newPos == 'array' && newPos.length == 2) {
100 jQuery.iResize.dragged.style.top = newTop + 'px';
101 jQuery.iResize.dragged.style.left = newLeft + 'px';
106 // Bind event handlers
108 .bind('mousemove', jQuery.iResize.move)
109 .bind('mouseup', jQuery.iResize.stop);
111 // Initialize resizable
112 jQuery.iResize.resizeElement = this.resizeElement;
113 jQuery.iResize.resizeDirection = this.resizeDirection;
114 jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
115 jQuery.iResize.sizes = {
116 width: parseInt(jQuery(this.resizeElement).css('width'))||0,
117 height: parseInt(jQuery(this.resizeElement).css('height'))||0
119 jQuery.iResize.position = {
120 top: parseInt(jQuery(this.resizeElement).css('top'))||0,
121 left: parseInt(jQuery(this.resizeElement).css('left'))||0
125 if (jQuery.iResize.resizeElement.resizeOptions.onStart) {
126 jQuery.iResize.resizeElement.resizeOptions.onStart.apply(jQuery.iResize.resizeElement, [this]);
132 // Unbind event handlers
134 .unbind('mousemove', jQuery.iResize.move)
135 .unbind('mouseup', jQuery.iResize.stop);
138 if (jQuery.iResize.resizeElement.resizeOptions.onStop) {
139 jQuery.iResize.resizeElement.resizeOptions.onStop.apply(jQuery.iResize.resizeElement, [jQuery.iResize.resizeDirection]);
143 jQuery.iResize.resizeElement = null;
144 jQuery.iResize.resizeDirection = null;
146 getWidth: function(dx, side) {
148 Math.max(jQuery.iResize.sizes.width + dx * side, jQuery.iResize.resizeElement.resizeOptions.minWidth),
149 jQuery.iResize.resizeElement.resizeOptions.maxWidth
152 getHeight: function(dy, side) {
154 Math.max(jQuery.iResize.sizes.height + dy * side, jQuery.iResize.resizeElement.resizeOptions.minHeight),
155 jQuery.iResize.resizeElement.resizeOptions.maxHeight
158 getHeightMinMax: function(height) {
160 Math.max(height, jQuery.iResize.resizeElement.resizeOptions.minHeight),
161 jQuery.iResize.resizeElement.resizeOptions.maxHeight
165 if (jQuery.iResize.resizeElement == null) {
169 pointer = jQuery.iUtil.getPointer(e);
170 dx = pointer.x - jQuery.iResize.pointer.x;
171 dy = pointer.y - jQuery.iResize.pointer.y;
174 width: jQuery.iResize.sizes.width,
175 height: jQuery.iResize.sizes.height
178 top: jQuery.iResize.position.top,
179 left: jQuery.iResize.position.left
182 switch (jQuery.iResize.resizeDirection){
184 newSizes.width = jQuery.iResize.getWidth(dx,1);
187 newSizes.width = jQuery.iResize.getWidth(dx,1);
188 newSizes.height = jQuery.iResize.getHeight(dy,1);
191 newSizes.width = jQuery.iResize.getWidth(dx,-1);
192 newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
195 newSizes.width = jQuery.iResize.getWidth(dx,-1);
196 newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
197 newSizes.height = jQuery.iResize.getHeight(dy,1);
200 newSizes.height = jQuery.iResize.getHeight(dy,-1);
201 newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
202 newSizes.width = jQuery.iResize.getWidth(dx,-1);
203 newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
206 newSizes.height = jQuery.iResize.getHeight(dy,-1);
207 newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
210 newSizes.height = jQuery.iResize.getHeight(dy,-1);
211 newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
212 newSizes.width = jQuery.iResize.getWidth(dx,1);
215 newSizes.height = jQuery.iResize.getHeight(dy,1);
219 if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
220 if (jQuery.iResize.resizeDirection == 'n' || jQuery.iResize.resizeDirection == 's')
221 nWidth = newSizes.height * jQuery.iResize.resizeElement.resizeOptions.ratio;
223 nWidth = newSizes.width;
224 nHeight = jQuery.iResize.getHeightMinMax(nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio);
225 nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
227 switch (jQuery.iResize.resizeDirection){
231 newPosition.top += newSizes.height - nHeight;
235 switch (jQuery.iResize.resizeDirection){
239 newPosition.left += newSizes.width - nWidth;
243 newSizes.height = nHeight;
244 newSizes.width = nWidth;
247 if (newPosition.top < jQuery.iResize.resizeElement.resizeOptions.minTop) {
248 nHeight = newSizes.height + newPosition.top - jQuery.iResize.resizeElement.resizeOptions.minTop;
249 newPosition.top = jQuery.iResize.resizeElement.resizeOptions.minTop;
251 if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
252 nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
253 switch (jQuery.iResize.resizeDirection){
257 newPosition.left += newSizes.width - nWidth;
260 newSizes.width = nWidth;
262 newSizes.height = nHeight;
265 if (newPosition.left < jQuery.iResize.resizeElement.resizeOptions.minLeft ) {
266 nWidth = newSizes.width + newPosition.left - jQuery.iResize.resizeElement.resizeOptions.minLeft;
267 newPosition.left = jQuery.iResize.resizeElement.resizeOptions.minLeft;
269 if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
270 nHeight = nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio;
271 switch (jQuery.iResize.resizeDirection){
275 newPosition.top += newSizes.height - nHeight;
278 newSizes.height = nHeight;
280 newSizes.width = nWidth;
283 if (newPosition.top + newSizes.height > jQuery.iResize.resizeElement.resizeOptions.maxBottom) {
284 newSizes.height = jQuery.iResize.resizeElement.resizeOptions.maxBottom - newPosition.top;
285 if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
286 newSizes.width = newSizes.height / jQuery.iResize.resizeElement.resizeOptions.ratio;
291 if (newPosition.left + newSizes.width > jQuery.iResize.resizeElement.resizeOptions.maxRight) {
292 newSizes.width = jQuery.iResize.resizeElement.resizeOptions.maxRight - newPosition.left;
293 if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
294 newSizes.height = newSizes.width * jQuery.iResize.resizeElement.resizeOptions.ratio;
299 var newDimensions = false;
300 if (jQuery.iResize.resizeElement.resizeOptions.onResize) {
301 newDimensions = jQuery.iResize.resizeElement.resizeOptions.onResize.apply( jQuery.iResize.resizeElement, [ newSizes, newPosition ] );
303 if (newDimensions.sizes) {
304 jQuery.extend(newSizes, newDimensions.sizes);
307 if (newDimensions.position) {
308 jQuery.extend(newPosition, newDimensions.position);
312 elS = jQuery.iResize.resizeElement.style;
313 elS.left = newPosition.left + 'px';
314 elS.top = newPosition.top + 'px';
315 elS.width = newSizes.width + 'px';
316 elS.height = newSizes.height + 'px';
321 * Builds the resizable
323 build: function(options) {
324 if (!options || !options.handlers || options.handlers.constructor != Object) {
331 el.resizeOptions = options;
332 el.resizeOptions.minWidth = options.minWidth || 10;
333 el.resizeOptions.minHeight = options.minHeight || 10;
334 el.resizeOptions.maxWidth = options.maxWidth || 3000;
335 el.resizeOptions.maxHeight = options.maxHeight || 3000;
336 el.resizeOptions.minTop = options.minTop || -1000;
337 el.resizeOptions.minLeft = options.minLeft || -1000;
338 el.resizeOptions.maxRight = options.maxRight || 3000;
339 el.resizeOptions.maxBottom = options.maxBottom || 3000;
340 elPosition = jQuery(el).css('position');
341 if (!(elPosition == 'relative' || elPosition == 'absolute')) {
342 el.style.position = 'relative';
345 directions = /n|ne|e|se|s|sw|w|nw/g;
346 for (i in el.resizeOptions.handlers) {
347 if (i.toLowerCase().match(directions) != null) {
348 if (el.resizeOptions.handlers[i].constructor == String) {
349 handle = jQuery(el.resizeOptions.handlers[i]);
350 if (handle.size() > 0) {
351 el.resizeOptions.handlers[i] = handle.get(0);
355 if (el.resizeOptions.handlers[i].tagName) {
356 el.resizeOptions.handlers[i].resizeElement = el;
357 el.resizeOptions.handlers[i].resizeDirection = i;
358 jQuery(el.resizeOptions.handlers[i]).bind('mousedown', jQuery.iResize.start);
363 if (el.resizeOptions.dragHandle) {
364 if (typeof el.resizeOptions.dragHandle === 'string') {
365 handleEl = jQuery(el.resizeOptions.dragHandle);
366 if (handleEl.size() > 0) {
367 handleEl.each(function() {
370 handleEl.bind('mousedown', jQuery.iResize.startDrag);
372 } else if (el.resizeOptions.dragHandle == true) {
373 jQuery(this).bind('mousedown', jQuery.iResize.startDrag);
380 * Destroys the resizable
382 destroy: function() {
387 // Unbind the handlers
388 for (i in el.resizeOptions.handlers) {
389 el.resizeOptions.handlers[i].resizeElement = null;
390 el.resizeOptions.handlers[i].resizeDirection = null;
391 jQuery(el.resizeOptions.handlers[i]).unbind('mousedown', jQuery.iResize.start);
394 // Remove the draghandle
395 if (el.resizeOptions.dragHandle) {
396 if (typeof el.resizeOptions.dragHandle === 'string') {
397 handle = jQuery(el.resizeOptions.dragHandle);
398 if (handle.size() > 0) {
399 handle.unbind('mousedown', jQuery.iResize.startDrag);
401 } else if (el.resizeOptions.dragHandle == true) {
402 jQuery(this).unbind('mousedown', jQuery.iResize.startDrag);
407 el.resizeOptions = null;
416 * Create a resizable element with a number of advanced options including callback, dragging
419 * @description Create a resizable element with a number of advanced options including callback, dragging
420 * @param Hash hash A hash of parameters. All parameters are optional.
421 * @option Hash handlers hash with keys for each resize direction (e, es, s, sw, w, nw, n) and value string selection
422 * @option Integer minWidth (optional) the minimum width that element can be resized to
423 * @option Integer maxWidth (optional) the maximum width that element can be resized to
424 * @option Integer minHeight (optional) the minimum height that element can be resized to
425 * @option Integer maxHeight (optional) the maximum height that element can be resized to
426 * @option Integer minTop (optional) the minmum top position to wich element can be moved to
427 * @option Integer minLeft (optional) the minmum left position to wich element can be moved to
428 * @option Integer maxRight (optional) the maximum right position to wich element can be moved to
429 * @option Integer maxBottom (optional) the maximum bottom position to wich element can be moved to
430 * @option Float ratio (optional) the ratio between width and height to constrain elements sizes to that ratio
431 * @option Mixed dragHandle (optional) true to make the element draggable, string selection for drag handle
432 * @option Function onDragStart (optional) A function to be executed whenever the dragging starts
433 * @option Function onDragStop (optional) A function to be executed whenever the dragging stops
434 * @option Function onDrag (optional) A function to be executed whenever the element is dragged
435 * @option Function onStart (optional) A function to be executed whenever the element starts to be resized
436 * @option Function onStop (optional) A function to be executed whenever the element stops to be resized
437 * @option Function onResize (optional) A function to be executed whenever the element is resized
439 * @cat Plugins/Interface
440 * @author Stefan Petre
442 Resizable: jQuery.iResize.build,
444 * Destroy a resizable
446 * @name ResizableDestroy
447 * @description Destroy a resizable
449 * @cat Plugins/Interface
450 * @author Stefan Petre
452 ResizableDestroy: jQuery.iResize.destroy