Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
YUI.add('yui2-resize', function(Y) {
2
    var YAHOO    = Y.YUI2;
3
    /*
4
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
5
Code licensed under the BSD License:
6
http://developer.yahoo.com/yui/license.html
7
version: 2.9.0
8
*/
9
/**
10
 * @description <p>Makes an element resizable</p>
11
 * @namespace YAHOO.util
12
 * @requires yahoo, dom, dragdrop, element, event
13
 * @optional animation
14
 * @module resize
15
 */
16
(function() {
17
var D = YAHOO.util.Dom,
18
    Event = YAHOO.util.Event,
19
    Lang = YAHOO.lang;
20
 
21
    /**
22
     * @constructor
23
     * @class Resize
24
     * @extends YAHOO.util.Element
25
     * @description <p>Makes an element resizable</p>
26
     * @param {String/HTMLElement} el The element to make resizable.
27
     * @param {Object} attrs Object liternal containing configuration parameters.
28
    */
29
 
30
    var Resize = function(el, config) {
31
        var oConfig = {
32
            element: el,
33
            attributes: config || {}
34
        };
35
 
36
        Resize.superclass.constructor.call(this, oConfig.element, oConfig.attributes);
37
    };
38
 
39
    /**
40
    * @private
41
    * @static
42
    * @property _instances
43
    * @description Internal hash table for all resize instances
44
    * @type Object
45
    */
46
    Resize._instances = {};
47
    /**
48
    * @static
49
    * @method getResizeById
50
    * @description Get's a resize object by the HTML id of the element associated with the Resize object.
51
    * @return {Object} The Resize Object
52
    */
53
    Resize.getResizeById = function(id) {
54
        if (Resize._instances[id]) {
55
            return Resize._instances[id];
56
        }
57
        return false;
58
    };
59
 
60
    YAHOO.extend(Resize, YAHOO.util.Element, {
61
        /**
62
        * @private
63
        * @property CSS_RESIZE
64
        * @description Base CSS class name
65
        * @type String
66
        */
67
        CSS_RESIZE: 'yui-resize',
68
        /**
69
        * @private
70
        * @property CSS_DRAG
71
        * @description Class name added when dragging is enabled
72
        * @type String
73
        */
74
        CSS_DRAG: 'yui-draggable',
75
        /**
76
        * @private
77
        * @property CSS_HOVER
78
        * @description Class name used for hover only handles
79
        * @type String
80
        */
81
        CSS_HOVER: 'yui-resize-hover',
82
        /**
83
        * @private
84
        * @property CSS_PROXY
85
        * @description Class name given to the proxy element
86
        * @type String
87
        */
88
        CSS_PROXY: 'yui-resize-proxy',
89
        /**
90
        * @private
91
        * @property CSS_WRAP
92
        * @description Class name given to the wrap element
93
        * @type String
94
        */
95
        CSS_WRAP: 'yui-resize-wrap',
96
        /**
97
        * @private
98
        * @property CSS_KNOB
99
        * @description Class name used to make the knob style handles
100
        * @type String
101
        */
102
        CSS_KNOB: 'yui-resize-knob',
103
        /**
104
        * @private
105
        * @property CSS_HIDDEN
106
        * @description Class name given to the wrap element to make all handles hidden
107
        * @type String
108
        */
109
        CSS_HIDDEN: 'yui-resize-hidden',
110
        /**
111
        * @private
112
        * @property CSS_HANDLE
113
        * @description Class name given to all handles, used as a base for single handle names as well.. Handle "t" will get this.CSS_HANDLE + '-t' as well as this.CSS_HANDLE
114
        * @type String
115
        */
116
        CSS_HANDLE: 'yui-resize-handle',
117
        /**
118
        * @private
119
        * @property CSS_STATUS
120
        * @description Class name given to the status element
121
        * @type String
122
        */
123
        CSS_STATUS: 'yui-resize-status',
124
        /**
125
        * @private
126
        * @property CSS_GHOST
127
        * @description Class name given to the wrap element when the ghost property is active
128
        * @type String
129
        */
130
        CSS_GHOST: 'yui-resize-ghost',
131
        /**
132
        * @private
133
        * @property CSS_RESIZING
134
        * @description Class name given to the wrap element when a resize action is taking place.
135
        * @type String
136
        */
137
        CSS_RESIZING: 'yui-resize-resizing',
138
        /**
139
        * @private
140
        * @property _resizeEvent
141
        * @description The mouse event used to resize with
142
        * @type Event
143
        */
144
        _resizeEvent: null,
145
        /**
146
        * @private
147
        * @property dd
148
        * @description The <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> instance used if draggable is true
149
        * @type Object
150
        */
151
        dd: null,
152
        /**
153
        * @private
154
        * @property browser
155
        * @description A copy of the YAHOO.env.ua property
156
        * @type Object
157
        */
158
        browser: YAHOO.env.ua,
159
        /**
160
        * @private
161
        * @property _locked
162
        * @description A flag to show if the resize is locked
163
        * @type Boolean
164
        */
165
        _locked: null,
166
        /**
167
        * @private
168
        * @property _positioned
169
        * @description A flag to show if the element is absolutely positioned
170
        * @type Boolean
171
        */
172
        _positioned: null,
173
        /**
174
        * @private
175
        * @property _dds
176
        * @description An Object containing references to all of the <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> instances used for the resize handles
177
        * @type Object
178
        */
179
        _dds: null,
180
        /**
181
        * @private
182
        * @property _wrap
183
        * @description The HTML reference of the element wrapper
184
        * @type HTMLElement
185
        */
186
        _wrap: null,
187
        /**
188
        * @private
189
        * @property _proxy
190
        * @description The HTML reference of the element proxy
191
        * @type HTMLElement
192
        */
193
        _proxy: null,
194
        /**
195
        * @private
196
        * @property _handles
197
        * @description An object containing references to all of the resize handles.
198
        * @type Object
199
        */
200
        _handles: null,
201
        /**
202
        * @private
203
        * @property _currentHandle
204
        * @description The string identifier of the currently active handle. e.g. 'r', 'br', 'tl'
205
        * @type String
206
        */
207
        _currentHandle: null,
208
        /**
209
        * @private
210
        * @property _currentDD
211
        * @description A link to the currently active DD object
212
        * @type Object
213
        */
214
        _currentDD: null,
215
        /**
216
        * @private
217
        * @property _cache
218
        * @description An lookup table containing key information for the element being resized. e.g. height, width, x position, y position, etc..
219
        * @type Object
220
        */
221
        _cache: null,
222
        /**
223
        * @private
224
        * @property _active
225
        * @description Flag to show if the resize is active. Used for events.
226
        * @type Boolean
227
        */
228
        _active: null,
229
        /**
230
        * @private
231
        * @method _createProxy
232
        * @description Creates the proxy element if the proxy config is true
233
        */
234
        _createProxy: function() {
235
            if (this.get('proxy')) {
236
                this._proxy = document.createElement('div');
237
                this._proxy.className = this.CSS_PROXY;
238
                this._proxy.style.height = this.get('element').clientHeight + 'px';
239
                this._proxy.style.width = this.get('element').clientWidth + 'px';
240
                this._wrap.parentNode.appendChild(this._proxy);
241
            } else {
242
                this.set('animate', false);
243
            }
244
        },
245
        /**
246
        * @private
247
        * @method _createWrap
248
        * @description Creates the wrap element if the wrap config is true. It will auto wrap the following element types: img, textarea, input, iframe, select
249
        */
250
        _createWrap: function() {
251
            this._positioned = false;
252
            //Force wrap for elements that can't have children
253
            if (this.get('wrap') === false) {
254
                switch (this.get('element').tagName.toLowerCase()) {
255
                    case 'img':
256
                    case 'textarea':
257
                    case 'input':
258
                    case 'iframe':
259
                    case 'select':
260
                        this.set('wrap', true);
261
                        break;
262
                }
263
            }
264
            if (this.get('wrap') === true) {
265
                this._wrap = document.createElement('div');
266
                this._wrap.id = this.get('element').id + '_wrap';
267
                this._wrap.className = this.CSS_WRAP;
268
                if (this.get('element').tagName.toLowerCase() == 'textarea') {
269
                    D.addClass(this._wrap, 'yui-resize-textarea');
270
                }
271
                D.setStyle(this._wrap, 'width', this.get('width') + 'px');
272
                D.setStyle(this._wrap, 'height', this.get('height') + 'px');
273
                D.setStyle(this._wrap, 'z-index', this.getStyle('z-index'));
274
                this.setStyle('z-index', 0);
275
                var pos = D.getStyle(this.get('element'), 'position');
276
                D.setStyle(this._wrap, 'position', ((pos == 'static') ? 'relative' : pos));
277
                D.setStyle(this._wrap, 'top', D.getStyle(this.get('element'), 'top'));
278
                D.setStyle(this._wrap, 'left', D.getStyle(this.get('element'), 'left'));
279
                if (D.getStyle(this.get('element'), 'position') == 'absolute') {
280
                    this._positioned = true;
281
                    D.setStyle(this.get('element'), 'position', 'relative');
282
                    D.setStyle(this.get('element'), 'top', '0');
283
                    D.setStyle(this.get('element'), 'left', '0');
284
                }
285
                var par = this.get('element').parentNode;
286
                par.replaceChild(this._wrap, this.get('element'));
287
                this._wrap.appendChild(this.get('element'));
288
            } else {
289
                this._wrap = this.get('element');
290
                if (D.getStyle(this._wrap, 'position') == 'absolute') {
291
                    this._positioned = true;
292
                }
293
            }
294
            if (this.get('draggable')) {
295
                this._setupDragDrop();
296
            }
297
            if (this.get('hover')) {
298
                D.addClass(this._wrap, this.CSS_HOVER);
299
            }
300
            if (this.get('knobHandles')) {
301
                D.addClass(this._wrap, this.CSS_KNOB);
302
            }
303
            if (this.get('hiddenHandles')) {
304
                D.addClass(this._wrap, this.CSS_HIDDEN);
305
            }
306
            D.addClass(this._wrap, this.CSS_RESIZE);
307
        },
308
        /**
309
        * @private
310
        * @method _setupDragDrop
311
        * @description Setup the <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> instance on the element
312
        */
313
        _setupDragDrop: function() {
314
            D.addClass(this._wrap, this.CSS_DRAG);
315
            this.dd = new YAHOO.util.DD(this._wrap, this.get('id') + '-resize', { dragOnly: true, useShim: this.get('useShim') });
316
            this.dd.on('dragEvent', function() {
317
                this.fireEvent('dragEvent', arguments);
318
            }, this, true);
319
        },
320
        /**
321
        * @private
322
        * @method _createHandles
323
        * @description Creates the handles as specified in the config
324
        */
325
        _createHandles: function() {
326
            this._handles = {};
327
            this._dds = {};
328
            var h = this.get('handles');
329
            for (var i = 0; i < h.length; i++) {
330
                this._handles[h[i]] = document.createElement('div');
331
                this._handles[h[i]].id = D.generateId(this._handles[h[i]]);
332
                this._handles[h[i]].className = this.CSS_HANDLE + ' ' + this.CSS_HANDLE + '-' + h[i];
333
                var k = document.createElement('div');
334
                k.className = this.CSS_HANDLE + '-inner-' + h[i];
335
                this._handles[h[i]].appendChild(k);
336
                this._wrap.appendChild(this._handles[h[i]]);
337
                Event.on(this._handles[h[i]], 'mouseover', this._handleMouseOver, this, true);
338
                Event.on(this._handles[h[i]], 'mouseout', this._handleMouseOut, this, true);
339
                this._dds[h[i]] = new YAHOO.util.DragDrop(this._handles[h[i]], this.get('id') + '-handle-' + h, { useShim: this.get('useShim') });
340
                this._dds[h[i]].setPadding(15, 15, 15, 15);
341
                this._dds[h[i]].on('startDragEvent', this._handleStartDrag, this._dds[h[i]], this);
342
                this._dds[h[i]].on('mouseDownEvent', this._handleMouseDown, this._dds[h[i]], this);
343
            }
344
            this._status = document.createElement('span');
345
            this._status.className = this.CSS_STATUS;
346
            document.body.insertBefore(this._status, document.body.firstChild);
347
        },
348
        /**
349
        * @private
350
        * @method _ieSelectFix
351
        * @description The function we use as the onselectstart handler when we start a drag in Internet Explorer
352
        */
353
        _ieSelectFix: function() {
354
            return false;
355
        },
356
        /**
357
        * @private
358
        * @property _ieSelectBack
359
        * @description We will hold a copy of the current "onselectstart" method on this property, and reset it after we are done using it.
360
        */
361
        _ieSelectBack: null,
362
        /**
363
        * @private
364
        * @method _setAutoRatio
365
        * @param {Event} ev A mouse event.
366
        * @description This method checks to see if the "autoRatio" config is set. If it is, we will check to see if the "Shift Key" is pressed. If so, we will set the config ratio to true.
367
        */
368
        _setAutoRatio: function(ev) {
369
            if (this.get('autoRatio')) {
370
                if (ev && ev.shiftKey) {
371
                    //Shift Pressed
372
                    this.set('ratio', true);
373
                } else {
374
                    this.set('ratio', this._configs.ratio._initialConfig.value);
375
                }
376
            }
377
        },
378
        /**
379
        * @private
380
        * @method _handleMouseDown
381
        * @param {Event} ev A mouse event.
382
        * @description This method preps the autoRatio on MouseDown.
383
        */
384
        _handleMouseDown: function(ev) {
385
            if (this._locked) {
386
                return false;
387
            }
388
            if (D.getStyle(this._wrap, 'position') == 'absolute') {
389
                this._positioned = true;
390
            }
391
            if (ev) {
392
                this._setAutoRatio(ev);
393
            }
394
            if (this.browser.ie) {
395
                this._ieSelectBack = document.body.onselectstart;
396
                document.body.onselectstart = this._ieSelectFix;
397
            }
398
        },
399
        /**
400
        * @private
401
        * @method _handleMouseOver
402
        * @param {Event} ev A mouse event.
403
        * @description Adds CSS class names to the handles
404
        */
405
        _handleMouseOver: function(ev) {
406
            if (this._locked) {
407
                return false;
408
            }
409
            D.removeClass(this._wrap, this.CSS_RESIZE);
410
 
411
            if (this.get('hover')) {
412
                D.removeClass(this._wrap, this.CSS_HOVER);
413
            }
414
            var tar = Event.getTarget(ev);
415
            if (!D.hasClass(tar, this.CSS_HANDLE)) {
416
                tar = tar.parentNode;
417
            }
418
            if (D.hasClass(tar, this.CSS_HANDLE) && !this._active) {
419
                D.addClass(tar, this.CSS_HANDLE + '-active');
420
                for (var i in this._handles) {
421
                    if (Lang.hasOwnProperty(this._handles, i)) {
422
                        if (this._handles[i] == tar) {
423
                            D.addClass(tar, this.CSS_HANDLE + '-' + i + '-active');
424
                            break;
425
                        }
426
                    }
427
                }
428
            }
429
 
430
            D.addClass(this._wrap, this.CSS_RESIZE);
431
        },
432
        /**
433
        * @private
434
        * @method _handleMouseOut
435
        * @param {Event} ev A mouse event.
436
        * @description Removes CSS class names to the handles
437
        */
438
        _handleMouseOut: function(ev) {
439
            D.removeClass(this._wrap, this.CSS_RESIZE);
440
            if (this.get('hover') && !this._active) {
441
                D.addClass(this._wrap, this.CSS_HOVER);
442
            }
443
            var tar = Event.getTarget(ev);
444
            if (!D.hasClass(tar, this.CSS_HANDLE)) {
445
                tar = tar.parentNode;
446
            }
447
            if (D.hasClass(tar, this.CSS_HANDLE) && !this._active) {
448
                D.removeClass(tar, this.CSS_HANDLE + '-active');
449
                for (var i in this._handles) {
450
                    if (Lang.hasOwnProperty(this._handles, i)) {
451
                        if (this._handles[i] == tar) {
452
                            D.removeClass(tar, this.CSS_HANDLE + '-' + i + '-active');
453
                            break;
454
                        }
455
                    }
456
                }
457
            }
458
            D.addClass(this._wrap, this.CSS_RESIZE);
459
        },
460
        /**
461
        * @private
462
        * @method _handleStartDrag
463
        * @param {Object} args The args passed from the CustomEvent.
464
        * @param {Object} dd The <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> object we are working with.
465
        * @description Resizes the proxy, sets up the <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> handlers, updates the status div and preps the cache
466
        */
467
        _handleStartDrag: function(args, dd) {
468
            var tar = dd.getDragEl();
469
            if (D.hasClass(tar, this.CSS_HANDLE)) {
470
                if (D.getStyle(this._wrap, 'position') == 'absolute') {
471
                    this._positioned = true;
472
                }
473
                this._active = true;
474
                this._currentDD = dd;
475
                if (this._proxy) {
476
                    this._proxy.style.visibility = 'visible';
477
                    this._proxy.style.zIndex = '1000';
478
                    this._proxy.style.height = this.get('element').clientHeight + 'px';
479
                    this._proxy.style.width = this.get('element').clientWidth + 'px';
480
                }
481
 
482
                for (var i in this._handles) {
483
                    if (Lang.hasOwnProperty(this._handles, i)) {
484
                        if (this._handles[i] == tar) {
485
                            this._currentHandle = i;
486
                            var handle = '_handle_for_' + i;
487
                            D.addClass(tar, this.CSS_HANDLE + '-' + i + '-active');
488
                            dd.on('dragEvent', this[handle], this, true);
489
                            dd.on('mouseUpEvent', this._handleMouseUp, this, true);
490
                            break;
491
                        }
492
                    }
493
                }
494
 
495
 
496
                D.addClass(tar, this.CSS_HANDLE + '-active');
497
 
498
                if (this.get('proxy')) {
499
                    var xy = D.getXY(this.get('element'));
500
                    D.setXY(this._proxy, xy);
501
                    if (this.get('ghost')) {
502
                        this.addClass(this.CSS_GHOST);
503
                    }
504
                }
505
                D.addClass(this._wrap, this.CSS_RESIZING);
506
                this._setCache();
507
                this._updateStatus(this._cache.height, this._cache.width, this._cache.top, this._cache.left);
508
                this.fireEvent('startResize', { type: 'startresize', target: this});
509
            }
510
        },
511
        /**
512
        * @private
513
        * @method _setCache
514
        * @description Sets up the this._cache hash table.
515
        */
516
        _setCache: function() {
517
            this._cache.xy = D.getXY(this._wrap);
518
            D.setXY(this._wrap, this._cache.xy);
519
            this._cache.height = this.get('clientHeight');
520
            this._cache.width = this.get('clientWidth');
521
            this._cache.start.height = this._cache.height;
522
            this._cache.start.width = this._cache.width;
523
            this._cache.start.top = this._cache.xy[1];
524
            this._cache.start.left = this._cache.xy[0];
525
            this._cache.top = this._cache.xy[1];
526
            this._cache.left = this._cache.xy[0];
527
            this.set('height', this._cache.height, true);
528
            this.set('width', this._cache.width, true);
529
        },
530
        /**
531
        * @private
532
        * @method _handleMouseUp
533
        * @param {Event} ev A mouse event.
534
        * @description Cleans up listeners, hides proxy element and removes class names.
535
        */
536
        _handleMouseUp: function(ev) {
537
            this._active = false;
538
 
539
            var handle = '_handle_for_' + this._currentHandle;
540
            this._currentDD.unsubscribe('dragEvent', this[handle], this, true);
541
            this._currentDD.unsubscribe('mouseUpEvent', this._handleMouseUp, this, true);
542
 
543
            if (this._proxy) {
544
                this._proxy.style.visibility = 'hidden';
545
                this._proxy.style.zIndex = '-1';
546
                if (this.get('setSize')) {
547
                    this.resize(ev, this._cache.height, this._cache.width, this._cache.top, this._cache.left, true);
548
                } else {
549
                    this.fireEvent('resize', { ev: 'resize', target: this, height: this._cache.height, width: this._cache.width, top: this._cache.top, left: this._cache.left });
550
                }
551
 
552
                if (this.get('ghost')) {
553
                    this.removeClass(this.CSS_GHOST);
554
                }
555
            }
556
 
557
            if (this.get('hover')) {
558
                D.addClass(this._wrap, this.CSS_HOVER);
559
            }
560
            if (this._status) {
561
                D.setStyle(this._status, 'display', 'none');
562
            }
563
            if (this.browser.ie) {
564
                document.body.onselectstart = this._ieSelectBack;
565
            }
566
 
567
            if (this.browser.ie) {
568
                D.removeClass(this._wrap, this.CSS_RESIZE);
569
            }
570
 
571
            for (var i in this._handles) {
572
                if (Lang.hasOwnProperty(this._handles, i)) {
573
                    D.removeClass(this._handles[i], this.CSS_HANDLE + '-active');
574
                }
575
            }
576
            if (this.get('hover') && !this._active) {
577
                D.addClass(this._wrap, this.CSS_HOVER);
578
            }
579
            D.removeClass(this._wrap, this.CSS_RESIZING);
580
 
581
            D.removeClass(this._handles[this._currentHandle], this.CSS_HANDLE + '-' + this._currentHandle + '-active');
582
            D.removeClass(this._handles[this._currentHandle], this.CSS_HANDLE + '-active');
583
 
584
            if (this.browser.ie) {
585
                D.addClass(this._wrap, this.CSS_RESIZE);
586
            }
587
 
588
            this._resizeEvent = null;
589
            this._currentHandle = null;
590
 
591
            if (!this.get('animate')) {
592
                this.set('height', this._cache.height, true);
593
                this.set('width', this._cache.width, true);
594
            }
595
 
596
            this.fireEvent('endResize', { ev: 'endResize', target: this, height: this._cache.height, width: this._cache.width, top: this._cache.top, left: this._cache.left });
597
        },
598
        /**
599
        * @private
600
        * @method _setRatio
601
        * @param {Number} h The height offset.
602
        * @param {Number} w The with offset.
603
        * @param {Number} t The top offset.
604
        * @param {Number} l The left offset.
605
        * @description Using the Height, Width, Top & Left, it recalcuates them based on the original element size.
606
        * @return {Array} The new Height, Width, Top & Left settings
607
        */
608
        _setRatio: function(h, w, t, l) {
609
            var oh = h, ow = w;
610
            if (this.get('ratio')) {
611
                var orgH = this._cache.height,
612
                    orgW = this._cache.width,
613
                    nh = parseInt(this.get('height'), 10),
614
                    nw = parseInt(this.get('width'), 10),
615
                    maxH = this.get('maxHeight'),
616
                    minH = this.get('minHeight'),
617
                    maxW = this.get('maxWidth'),
618
                    minW = this.get('minWidth');
619
 
620
                switch (this._currentHandle) {
621
                    case 'l':
622
                        h = nh * (w / nw);
623
                        h = Math.min(Math.max(minH, h), maxH);
624
                        w = nw * (h / nh);
625
                        t = (this._cache.start.top - (-((nh - h) / 2)));
626
                        l = (this._cache.start.left - (-((nw - w))));
627
                        break;
628
                    case 'r':
629
                        h = nh * (w / nw);
630
                        h = Math.min(Math.max(minH, h), maxH);
631
                        w = nw * (h / nh);
632
                        t = (this._cache.start.top - (-((nh - h) / 2)));
633
                        break;
634
                    case 't':
635
                        w = nw * (h / nh);
636
                        h = nh * (w / nw);
637
                        l = (this._cache.start.left - (-((nw - w) / 2)));
638
                        t = (this._cache.start.top - (-((nh - h))));
639
                        break;
640
                    case 'b':
641
                        w = nw * (h / nh);
642
                        h = nh * (w / nw);
643
                        l = (this._cache.start.left - (-((nw - w) / 2)));
644
                        break;
645
                    case 'bl':
646
                        h = nh * (w / nw);
647
                        w = nw * (h / nh);
648
                        l = (this._cache.start.left - (-((nw - w))));
649
                        break;
650
                    case 'br':
651
                        h = nh * (w / nw);
652
                        w = nw * (h / nh);
653
                        break;
654
                    case 'tl':
655
                        h = nh * (w / nw);
656
                        w = nw * (h / nh);
657
                        l = (this._cache.start.left - (-((nw - w))));
658
                        t = (this._cache.start.top - (-((nh - h))));
659
                        break;
660
                    case 'tr':
661
                        h = nh * (w / nw);
662
                        w = nw * (h / nh);
663
                        l = (this._cache.start.left);
664
                        t = (this._cache.start.top - (-((nh - h))));
665
                        break;
666
                }
667
                oh = this._checkHeight(h);
668
                ow = this._checkWidth(w);
669
                if ((oh != h) || (ow != w)) {
670
                    t = 0;
671
                    l = 0;
672
                    if (oh != h) {
673
                        ow = this._cache.width;
674
                    }
675
                    if (ow != w) {
676
                        oh = this._cache.height;
677
                    }
678
                }
679
            }
680
            return [oh, ow, t, l];
681
        },
682
        /**
683
        * @private
684
        * @method _updateStatus
685
        * @param {Number} h The new height setting.
686
        * @param {Number} w The new width setting.
687
        * @param {Number} t The new top setting.
688
        * @param {Number} l The new left setting.
689
        * @description Using the Height, Width, Top & Left, it updates the status element with the elements sizes.
690
        */
691
        _updateStatus: function(h, w, t, l) {
692
            if (this._resizeEvent && (!Lang.isString(this._resizeEvent))) {
693
                h = ((h === 0) ? this._cache.start.height : h);
694
                w = ((w === 0) ? this._cache.start.width : w);
695
                var h1 = parseInt(this.get('height'), 10),
696
                    w1 = parseInt(this.get('width'), 10);
697
 
698
                if (isNaN(h1)) {
699
                    h1 = parseInt(h, 10);
700
                }
701
                if (isNaN(w1)) {
702
                    w1 = parseInt(w, 10);
703
                }
704
                var diffH = (parseInt(h, 10) - h1);
705
                var diffW = (parseInt(w, 10) - w1);
706
                this._cache.offsetHeight = diffH;
707
                this._cache.offsetWidth = diffW;
708
                if (this.get('status')) {
709
                    D.setStyle(this._status, 'display', 'inline');
710
                    //This will cause IE8 to crash if the status box is hidden..
711
                    this._status.innerHTML = '<strong>' + parseInt(h, 10) + ' x ' + parseInt(w, 10) + '</strong><em>' + ((diffH > 0) ? '+' : '') + diffH + ' x ' + ((diffW > 0) ? '+' : '') + diffW + '</em>';
712
                    D.setXY(this._status, [Event.getPageX(this._resizeEvent) + 12, Event.getPageY(this._resizeEvent) + 12]);
713
                }
714
            }
715
        },
716
        /**
717
        * @method lock
718
        * @description Lock the resize so it can't be resized
719
        * @param {Boolean} dd If the draggable config is set, lock it too
720
        * @return {<a href="YAHOO.util.Resize.html">YAHOO.util.Resize</a>} The Resize instance
721
        */
722
        lock: function(dd) {
723
            this._locked = true;
724
            if (dd && this.dd) {
725
                D.removeClass(this._wrap, 'yui-draggable');
726
                this.dd.lock();
727
            }
728
            return this;
729
        },
730
        /**
731
        * @method unlock
732
        * @description Unlock the resize so it can be resized
733
        * @param {Boolean} dd If the draggable config is set, unlock it too
734
        * @return {<a href="YAHOO.util.Resize.html">YAHOO.util.Resize</a>} The Resize instance
735
        */
736
        unlock: function(dd) {
737
            this._locked = false;
738
            if (dd && this.dd) {
739
                D.addClass(this._wrap, 'yui-draggable');
740
                this.dd.unlock();
741
            }
742
            return this;
743
        },
744
        /**
745
        * @method isLocked
746
        * @description Check the locked status of the resize instance
747
        * @return {Boolean}
748
        */
749
        isLocked: function() {
750
            return this._locked;
751
        },
752
        /**
753
        * @method reset
754
        * @description Resets the element to is start state.
755
        * @return {<a href="YAHOO.util.Resize.html">YAHOO.util.Resize</a>} The Resize instance
756
        */
757
        reset: function() {
758
            this.resize(null, this._cache.start.height, this._cache.start.width, this._cache.start.top, this._cache.start.left, true);
759
            return this;
760
        },
761
        /**
762
        * @private
763
        * @method resize
764
        * @param {Event} ev The mouse event.
765
        * @param {Number} h The new height setting.
766
        * @param {Number} w The new width setting.
767
        * @param {Number} t The new top setting.
768
        * @param {Number} l The new left setting.
769
        * @param {Boolean} force Resize the element (used for proxy resize).
770
        * @param {Boolean} silent Don't fire the beforeResize Event.
771
        * @description Resizes the element, wrapper or proxy based on the data from the handlers.
772
        * @return {<a href="YAHOO.util.Resize.html">YAHOO.util.Resize</a>} The Resize instance
773
        */
774
        resize: function(ev, h, w, t, l, force, silent) {
775
            if (this._locked) {
776
                return false;
777
            }
778
            this._resizeEvent = ev;
779
            var el = this._wrap, anim = this.get('animate'), set = true;
780
            if (this._proxy && !force) {
781
                el = this._proxy;
782
                anim = false;
783
            }
784
            this._setAutoRatio(ev);
785
            if (this._positioned) {
786
                if (this._proxy) {
787
                    t = this._cache.top - t;
788
                    l = this._cache.left - l;
789
                }
790
            }
791
 
792
 
793
            var ratio = this._setRatio(h, w, t, l);
794
            h = parseInt(ratio[0], 10);
795
            w = parseInt(ratio[1], 10);
796
            t = parseInt(ratio[2], 10);
797
            l = parseInt(ratio[3], 10);
798
 
799
            if (t == 0) {
800
                //No Offset, get from cache
801
                t = D.getY(el);
802
            }
803
            if (l == 0) {
804
                //No Offset, get from cache
805
                l = D.getX(el);
806
            }
807
 
808
 
809
 
810
            if (this._positioned) {
811
                if (this._proxy && force) {
812
                    if (!anim) {
813
                        el.style.top = this._proxy.style.top;
814
                        el.style.left = this._proxy.style.left;
815
                    } else {
816
                        t = this._proxy.style.top;
817
                        l = this._proxy.style.left;
818
                    }
819
                } else {
820
                    if (!this.get('ratio') && !this._proxy) {
821
                        t = this._cache.top + -(t);
822
                        l = this._cache.left + -(l);
823
                    }
824
                    if (t) {
825
                        if (this.get('minY')) {
826
                            if (t < this.get('minY')) {
827
                                t = this.get('minY');
828
                            }
829
                        }
830
                        if (this.get('maxY')) {
831
                            if (t > this.get('maxY')) {
832
                                t = this.get('maxY');
833
                            }
834
                        }
835
                    }
836
                    if (l) {
837
                        if (this.get('minX')) {
838
                            if (l < this.get('minX')) {
839
                                l = this.get('minX');
840
                            }
841
                        }
842
                        if (this.get('maxX')) {
843
                            if ((l + w) > this.get('maxX')) {
844
                                l = (this.get('maxX') - w);
845
                            }
846
                        }
847
                    }
848
                }
849
            }
850
            if (!silent) {
851
                var beforeReturn = this.fireEvent('beforeResize', { ev: 'beforeResize', target: this, height: h, width: w, top: t, left: l });
852
                if (beforeReturn === false) {
853
                    return false;
854
                }
855
            }
856
 
857
            this._updateStatus(h, w, t, l);
858
 
859
 
860
            if (this._positioned) {
861
                if (this._proxy && force) {
862
                    //Do nothing
863
                } else {
864
                    if (t) {
865
                        D.setY(el, t);
866
                        this._cache.top = t;
867
                    }
868
                    if (l) {
869
                        D.setX(el, l);
870
                        this._cache.left = l;
871
                    }
872
                }
873
            }
874
            if (h) {
875
                if (!anim) {
876
                    set = true;
877
                    if (this._proxy && force) {
878
                        if (!this.get('setSize')) {
879
                            set = false;
880
                        }
881
                    }
882
                    if (set) {
883
                        el.style.height = h + 'px';
884
                    }
885
                    if ((this._proxy && force) || !this._proxy) {
886
                        if (this._wrap != this.get('element')) {
887
                            this.get('element').style.height = h + 'px';
888
                        }
889
                    }
890
                }
891
                this._cache.height = h;
892
            }
893
            if (w) {
894
                this._cache.width = w;
895
                if (!anim) {
896
                    set = true;
897
                    if (this._proxy && force) {
898
                        if (!this.get('setSize')) {
899
                            set = false;
900
                        }
901
                    }
902
                    if (set) {
903
                        el.style.width = w + 'px';
904
                    }
905
                    if ((this._proxy && force) || !this._proxy) {
906
                        if (this._wrap != this.get('element')) {
907
                            this.get('element').style.width = w + 'px';
908
                        }
909
                    }
910
                }
911
            }
912
            if (anim) {
913
                if (YAHOO.util.Anim) {
914
                    var _anim = new YAHOO.util.Anim(el, {
915
                        height: {
916
                            to: this._cache.height
917
                        },
918
                        width: {
919
                            to: this._cache.width
920
                        }
921
                    }, this.get('animateDuration'), this.get('animateEasing'));
922
                    if (this._positioned) {
923
                        if (t) {
924
                            _anim.attributes.top = {
925
                                to: parseInt(t, 10)
926
                            };
927
                        }
928
                        if (l) {
929
                            _anim.attributes.left = {
930
                                to: parseInt(l, 10)
931
                            };
932
                        }
933
                    }
934
 
935
                    if (this._wrap != this.get('element')) {
936
                        _anim.onTween.subscribe(function() {
937
                            this.get('element').style.height = el.style.height;
938
                            this.get('element').style.width = el.style.width;
939
                        }, this, true);
940
                    }
941
 
942
                    _anim.onComplete.subscribe(function() {
943
                        this.set('height', h);
944
                        this.set('width', w);
945
                        this.fireEvent('resize', { ev: 'resize', target: this, height: h, width: w, top: t, left: l });
946
                    }, this, true);
947
                    _anim.animate();
948
 
949
                }
950
            } else {
951
                if (this._proxy && !force) {
952
                    this.fireEvent('proxyResize', { ev: 'proxyresize', target: this, height: h, width: w, top: t, left: l });
953
                } else {
954
                    this.fireEvent('resize', { ev: 'resize', target: this, height: h, width: w, top: t, left: l });
955
                }
956
            }
957
            return this;
958
        },
959
        /**
960
        * @private
961
        * @method _handle_for_br
962
        * @param {Object} args The arguments from the CustomEvent.
963
        * @description Handles the sizes for the Bottom Right handle.
964
        */
965
        _handle_for_br: function(args) {
966
            var newW = this._setWidth(args.e);
967
            var newH = this._setHeight(args.e);
968
            this.resize(args.e, newH, newW, 0, 0);
969
        },
970
        /**
971
        * @private
972
        * @method _handle_for_bl
973
        * @param {Object} args The arguments from the CustomEvent.
974
        * @description Handles the sizes for the Bottom Left handle.
975
        */
976
        _handle_for_bl: function(args) {
977
            var newW = this._setWidth(args.e, true);
978
            var newH = this._setHeight(args.e);
979
            var l = (newW - this._cache.width);
980
            this.resize(args.e, newH, newW, 0, l);
981
        },
982
        /**
983
        * @private
984
        * @method _handle_for_tl
985
        * @param {Object} args The arguments from the CustomEvent.
986
        * @description Handles the sizes for the Top Left handle.
987
        */
988
        _handle_for_tl: function(args) {
989
            var newW = this._setWidth(args.e, true);
990
            var newH = this._setHeight(args.e, true);
991
            var t = (newH - this._cache.height);
992
            var l = (newW - this._cache.width);
993
            this.resize(args.e, newH, newW, t, l);
994
        },
995
        /**
996
        * @private
997
        * @method _handle_for_tr
998
        * @param {Object} args The arguments from the CustomEvent.
999
        * @description Handles the sizes for the Top Right handle.
1000
        */
1001
        _handle_for_tr: function(args) {
1002
            var newW = this._setWidth(args.e);
1003
            var newH = this._setHeight(args.e, true);
1004
            var t = (newH - this._cache.height);
1005
            this.resize(args.e, newH, newW, t, 0);
1006
        },
1007
        /**
1008
        * @private
1009
        * @method _handle_for_r
1010
        * @param {Object} args The arguments from the CustomEvent.
1011
        * @description Handles the sizes for the Right handle.
1012
        */
1013
        _handle_for_r: function(args) {
1014
            this._dds.r.setYConstraint(0,0);
1015
            var newW = this._setWidth(args.e);
1016
            this.resize(args.e, 0, newW, 0, 0);
1017
        },
1018
        /**
1019
        * @private
1020
        * @method _handle_for_l
1021
        * @param {Object} args The arguments from the CustomEvent.
1022
        * @description Handles the sizes for the Left handle.
1023
        */
1024
        _handle_for_l: function(args) {
1025
            this._dds.l.setYConstraint(0,0);
1026
            var newW = this._setWidth(args.e, true);
1027
            var l = (newW - this._cache.width);
1028
            this.resize(args.e, 0, newW, 0, l);
1029
        },
1030
        /**
1031
        * @private
1032
        * @method _handle_for_b
1033
        * @param {Object} args The arguments from the CustomEvent.
1034
        * @description Handles the sizes for the Bottom handle.
1035
        */
1036
        _handle_for_b: function(args) {
1037
            this._dds.b.setXConstraint(0,0);
1038
            var newH = this._setHeight(args.e);
1039
            this.resize(args.e, newH, 0, 0, 0);
1040
        },
1041
        /**
1042
        * @private
1043
        * @method _handle_for_t
1044
        * @param {Object} args The arguments from the CustomEvent.
1045
        * @description Handles the sizes for the Top handle.
1046
        */
1047
        _handle_for_t: function(args) {
1048
            this._dds.t.setXConstraint(0,0);
1049
            var newH = this._setHeight(args.e, true);
1050
            var t = (newH - this._cache.height);
1051
            this.resize(args.e, newH, 0, t, 0);
1052
        },
1053
        /**
1054
        * @private
1055
        * @method _setWidth
1056
        * @param {Event} ev The mouse event.
1057
        * @param {Boolean} flip Argument to determine the direction of the movement.
1058
        * @description Calculates the width based on the mouse event.
1059
        * @return {Number} The new value
1060
        */
1061
        _setWidth: function(ev, flip) {
1062
            var xy = this._cache.xy[0],
1063
                w = this._cache.width,
1064
                x = Event.getPageX(ev),
1065
                nw = (x - xy);
1066
 
1067
                if (flip) {
1068
                    nw = (xy - x) + parseInt(this.get('width'), 10);
1069
                }
1070
 
1071
                nw = this._snapTick(nw, this.get('xTicks'));
1072
                nw = this._checkWidth(nw);
1073
            return nw;
1074
        },
1075
        /**
1076
        * @private
1077
        * @method _checkWidth
1078
        * @param {Number} w The width to check.
1079
        * @description Checks the value passed against the maxWidth and minWidth.
1080
        * @return {Number} the new value
1081
        */
1082
        _checkWidth: function(w) {
1083
            if (this.get('minWidth')) {
1084
                if (w <= this.get('minWidth')) {
1085
                    w = this.get('minWidth');
1086
                }
1087
            }
1088
            if (this.get('maxWidth')) {
1089
                if (w >= this.get('maxWidth')) {
1090
                    w = this.get('maxWidth');
1091
                }
1092
            }
1093
            return w;
1094
        },
1095
        /**
1096
        * @private
1097
        * @method _checkHeight
1098
        * @param {Number} h The height to check.
1099
        * @description Checks the value passed against the maxHeight and minHeight.
1100
        * @return {Number} The new value
1101
        */
1102
        _checkHeight: function(h) {
1103
            if (this.get('minHeight')) {
1104
                if (h <= this.get('minHeight')) {
1105
                    h = this.get('minHeight');
1106
                }
1107
            }
1108
            if (this.get('maxHeight')) {
1109
                if (h >= this.get('maxHeight')) {
1110
                    h = this.get('maxHeight');
1111
                }
1112
            }
1113
            return h;
1114
        },
1115
        /**
1116
        * @private
1117
        * @method _setHeight
1118
        * @param {Event} ev The mouse event.
1119
        * @param {Boolean} flip Argument to determine the direction of the movement.
1120
        * @description Calculated the height based on the mouse event.
1121
        * @return {Number} The new value
1122
        */
1123
        _setHeight: function(ev, flip) {
1124
            var xy = this._cache.xy[1],
1125
                h = this._cache.height,
1126
                y = Event.getPageY(ev),
1127
                nh = (y - xy);
1128
 
1129
                if (flip) {
1130
                    nh = (xy - y) + parseInt(this.get('height'), 10);
1131
                }
1132
                nh = this._snapTick(nh, this.get('yTicks'));
1133
                nh = this._checkHeight(nh);
1134
 
1135
            return nh;
1136
        },
1137
        /**
1138
        * @private
1139
        * @method _snapTick
1140
        * @param {Number} size The size to tick against.
1141
        * @param {Number} pix The tick pixels.
1142
        * @description Adjusts the number based on the ticks used.
1143
        * @return {Number} the new snapped position
1144
        */
1145
        _snapTick: function(size, pix) {
1146
            if (!size || !pix) {
1147
                return size;
1148
            }
1149
            var _s = size;
1150
            var _x = size % pix;
1151
            if (_x > 0) {
1152
                if (_x > (pix / 2)) {
1153
                    _s = size + (pix - _x);
1154
                } else {
1155
                    _s = size - _x;
1156
                }
1157
            }
1158
            return _s;
1159
        },
1160
        /**
1161
        * @private
1162
        * @method init
1163
        * @description The Resize class's initialization method
1164
        */
1165
        init: function(p_oElement, p_oAttributes) {
1166
            this._locked = false;
1167
            this._cache = {
1168
                xy: [],
1169
                height: 0,
1170
                width: 0,
1171
                top: 0,
1172
                left: 0,
1173
                offsetHeight: 0,
1174
                offsetWidth: 0,
1175
                start: {
1176
                    height: 0,
1177
                    width: 0,
1178
                    top: 0,
1179
                    left: 0
1180
                }
1181
            };
1182
 
1183
            Resize.superclass.init.call(this, p_oElement, p_oAttributes);
1184
 
1185
            this.set('setSize', this.get('setSize'));
1186
 
1187
            if (p_oAttributes.height) {
1188
                this.set('height', parseInt(p_oAttributes.height, 10));
1189
            } else {
1190
                var h = this.getStyle('height');
1191
                if (h == 'auto') {
1192
                    this.set('height', parseInt(this.get('element').offsetHeight, 10));
1193
                }
1194
            }
1195
            if (p_oAttributes.width) {
1196
                this.set('width', parseInt(p_oAttributes.width, 10));
1197
            } else {
1198
                var w = this.getStyle('width');
1199
                if (w == 'auto') {
1200
                    this.set('width', parseInt(this.get('element').offsetWidth, 10));
1201
                }
1202
            }
1203
 
1204
            var id = p_oElement;
1205
            if (!Lang.isString(id)) {
1206
                id = D.generateId(id);
1207
            }
1208
            Resize._instances[id] = this;
1209
 
1210
            this._active = false;
1211
 
1212
            this._createWrap();
1213
            this._createProxy();
1214
            this._createHandles();
1215
 
1216
        },
1217
        /**
1218
        * @method getProxyEl
1219
        * @description Get the HTML reference for the proxy, returns null if no proxy.
1220
        * @return {HTMLElement} The proxy element
1221
        */
1222
        getProxyEl: function() {
1223
            return this._proxy;
1224
        },
1225
        /**
1226
        * @method getWrapEl
1227
        * @description Get the HTML reference for the wrap element, returns the current element if not wrapped.
1228
        * @return {HTMLElement} The wrap element
1229
        */
1230
        getWrapEl: function() {
1231
            return this._wrap;
1232
        },
1233
        /**
1234
        * @method getStatusEl
1235
        * @description Get the HTML reference for the status element.
1236
        * @return {HTMLElement} The status element
1237
        */
1238
        getStatusEl: function() {
1239
            return this._status;
1240
        },
1241
        /**
1242
        * @method getActiveHandleEl
1243
        * @description Get the HTML reference for the currently active resize handle.
1244
        * @return {HTMLElement} The handle element that is active
1245
        */
1246
        getActiveHandleEl: function() {
1247
            return this._handles[this._currentHandle];
1248
        },
1249
        /**
1250
        * @method isActive
1251
        * @description Returns true or false if a resize operation is currently active on the element.
1252
        * @return {Boolean}
1253
        */
1254
        isActive: function() {
1255
            return ((this._active) ? true : false);
1256
        },
1257
        /**
1258
        * @private
1259
        * @method initAttributes
1260
        * @description Initializes all of the configuration attributes used to create a resizable element.
1261
        * @param {Object} attr Object literal specifying a set of
1262
        * configuration attributes used to create the utility.
1263
        */
1264
        initAttributes: function(attr) {
1265
            Resize.superclass.initAttributes.call(this, attr);
1266
 
1267
            /**
1268
            * @attribute useShim
1269
            * @description This setting will be passed to the DragDrop instances on the resize handles and for the draggable property.
1270
            * This property should be used if you want the resize handles to work over iframe and other elements.
1271
            * @type Boolean
1272
            */
1273
            this.setAttributeConfig('useShim', {
1274
                value: ((attr.useShim === true) ? true : false),
1275
                validator: YAHOO.lang.isBoolean,
1276
                method: function(u) {
1277
                    for (var i in this._dds) {
1278
                        if (Lang.hasOwnProperty(this._dds, i)) {
1279
                            this._dds[i].useShim = u;
1280
                        }
1281
                    }
1282
                    if (this.dd) {
1283
                        this.dd.useShim = u;
1284
                    }
1285
                }
1286
            });
1287
            /**
1288
            * @attribute setSize
1289
            * @description Set the size of the resized element, if set to false the element will not be auto resized,
1290
            * the resize event will contain the dimensions so the end user can resize it on their own.
1291
            * This setting will only work with proxy set to true and animate set to false.
1292
            * @type Boolean
1293
            */
1294
            this.setAttributeConfig('setSize', {
1295
                value: ((attr.setSize === false) ? false : true),
1296
                validator: YAHOO.lang.isBoolean
1297
            });
1298
 
1299
            /**
1300
            * @attribute wrap
1301
            * @description Should we wrap the element
1302
            * @type Boolean
1303
            */
1304
            this.setAttributeConfig('wrap', {
1305
                writeOnce: true,
1306
                validator: YAHOO.lang.isBoolean,
1307
                value: attr.wrap || false
1308
            });
1309
 
1310
            /**
1311
            * @attribute handles
1312
            * @description The handles to use (any combination of): 't', 'b', 'r', 'l', 'bl', 'br', 'tl', 'tr'. Defaults to: ['r', 'b', 'br'].
1313
            * Can use a shortcut of All. Note: 8 way resizing should be done on an element that is absolutely positioned.
1314
            * @type Array
1315
            */
1316
            this.setAttributeConfig('handles', {
1317
                writeOnce: true,
1318
                value: attr.handles || ['r', 'b', 'br'],
1319
                validator: function(handles) {
1320
                    if (Lang.isString(handles) && handles.toLowerCase() == 'all') {
1321
                        handles = ['t', 'b', 'r', 'l', 'bl', 'br', 'tl', 'tr'];
1322
                    }
1323
                    if (!Lang.isArray(handles)) {
1324
                        handles = handles.replace(/, /g, ',');
1325
                        handles = handles.split(',');
1326
                    }
1327
                    this._configs.handles.value = handles;
1328
                }
1329
            });
1330
 
1331
            /**
1332
            * @attribute width
1333
            * @description The width of the element
1334
            * @type Number
1335
            */
1336
            this.setAttributeConfig('width', {
1337
                value: attr.width || parseInt(this.getStyle('width'), 10),
1338
                validator: YAHOO.lang.isNumber,
1339
                method: function(width) {
1340
                    width = parseInt(width, 10);
1341
                    if (width > 0) {
1342
                        if (this.get('setSize')) {
1343
                            this.setStyle('width', width + 'px');
1344
                        }
1345
                        this._cache.width = width;
1346
                        this._configs.width.value = width;
1347
                    }
1348
                }
1349
            });
1350
 
1351
            /**
1352
            * @attribute height
1353
            * @description The height of the element
1354
            * @type Number
1355
            */
1356
            this.setAttributeConfig('height', {
1357
                value: attr.height || parseInt(this.getStyle('height'), 10),
1358
                validator: YAHOO.lang.isNumber,
1359
                method: function(height) {
1360
                    height = parseInt(height, 10);
1361
                    if (height > 0) {
1362
                        if (this.get('setSize')) {
1363
                            this.setStyle('height', height + 'px');
1364
                        }
1365
                        this._cache.height = height;
1366
                        this._configs.height.value = height;
1367
                    }
1368
                }
1369
            });
1370
 
1371
            /**
1372
            * @attribute minWidth
1373
            * @description The minimum width of the element
1374
            * @type Number
1375
            */
1376
            this.setAttributeConfig('minWidth', {
1377
                value: attr.minWidth || 15,
1378
                validator: YAHOO.lang.isNumber
1379
            });
1380
 
1381
            /**
1382
            * @attribute minHeight
1383
            * @description The minimum height of the element
1384
            * @type Number
1385
            */
1386
            this.setAttributeConfig('minHeight', {
1387
                value: attr.minHeight || 15,
1388
                validator: YAHOO.lang.isNumber
1389
            });
1390
 
1391
            /**
1392
            * @attribute maxWidth
1393
            * @description The maximum width of the element
1394
            * @type Number
1395
            */
1396
            this.setAttributeConfig('maxWidth', {
1397
                value: attr.maxWidth || 10000,
1398
                validator: YAHOO.lang.isNumber
1399
            });
1400
 
1401
            /**
1402
            * @attribute maxHeight
1403
            * @description The maximum height of the element
1404
            * @type Number
1405
            */
1406
            this.setAttributeConfig('maxHeight', {
1407
                value: attr.maxHeight || 10000,
1408
                validator: YAHOO.lang.isNumber
1409
            });
1410
 
1411
            /**
1412
            * @attribute minY
1413
            * @description The minimum y coord of the element
1414
            * @type Number
1415
            */
1416
            this.setAttributeConfig('minY', {
1417
                value: attr.minY || false
1418
            });
1419
 
1420
            /**
1421
            * @attribute minX
1422
            * @description The minimum x coord of the element
1423
            * @type Number
1424
            */
1425
            this.setAttributeConfig('minX', {
1426
                value: attr.minX || false
1427
            });
1428
            /**
1429
            * @attribute maxY
1430
            * @description The max y coord of the element
1431
            * @type Number
1432
            */
1433
            this.setAttributeConfig('maxY', {
1434
                value: attr.maxY || false
1435
            });
1436
 
1437
            /**
1438
            * @attribute maxX
1439
            * @description The max x coord of the element
1440
            * @type Number
1441
            */
1442
            this.setAttributeConfig('maxX', {
1443
                value: attr.maxX || false
1444
            });
1445
 
1446
            /**
1447
            * @attribute animate
1448
            * @description Should be use animation to resize the element (can only be used if we use proxy).
1449
            * @type Boolean
1450
            */
1451
            this.setAttributeConfig('animate', {
1452
                value: attr.animate || false,
1453
                validator: function(value) {
1454
                    var ret = true;
1455
                    if (!YAHOO.util.Anim) {
1456
                        ret = false;
1457
                    }
1458
                    return ret;
1459
                }
1460
            });
1461
 
1462
            /**
1463
            * @attribute animateEasing
1464
            * @description The Easing to apply to the animation.
1465
            * @type Object
1466
            */
1467
            this.setAttributeConfig('animateEasing', {
1468
                value: attr.animateEasing || function() {
1469
                    var easing = false;
1470
                    if (YAHOO.util.Easing && YAHOO.util.Easing.easeOut) {
1471
                        easing = YAHOO.util.Easing.easeOut;
1472
                    }
1473
                    return easing;
1474
                }()
1475
            });
1476
 
1477
            /**
1478
            * @attribute animateDuration
1479
            * @description The Duration to apply to the animation.
1480
            * @type Number
1481
            */
1482
            this.setAttributeConfig('animateDuration', {
1483
                value: attr.animateDuration || 0.5
1484
            });
1485
 
1486
            /**
1487
            * @attribute proxy
1488
            * @description Resize a proxy element instead of the real element.
1489
            * @type Boolean
1490
            */
1491
            this.setAttributeConfig('proxy', {
1492
                value: attr.proxy || false,
1493
                validator: YAHOO.lang.isBoolean
1494
            });
1495
 
1496
            /**
1497
            * @attribute ratio
1498
            * @description Maintain the element's ratio when resizing.
1499
            * @type Boolean
1500
            */
1501
            this.setAttributeConfig('ratio', {
1502
                value: attr.ratio || false,
1503
                validator: YAHOO.lang.isBoolean
1504
            });
1505
 
1506
            /**
1507
            * @attribute ghost
1508
            * @description Apply an opacity filter to the element being resized (only works with proxy).
1509
            * @type Boolean
1510
            */
1511
            this.setAttributeConfig('ghost', {
1512
                value: attr.ghost || false,
1513
                validator: YAHOO.lang.isBoolean
1514
            });
1515
 
1516
            /**
1517
            * @attribute draggable
1518
            * @description A convienence method to make the element draggable
1519
            * @type Boolean
1520
            */
1521
            this.setAttributeConfig('draggable', {
1522
                value: attr.draggable || false,
1523
                validator: YAHOO.lang.isBoolean,
1524
                method: function(dd) {
1525
                    if (dd && this._wrap && !this.dd) {
1526
                        this._setupDragDrop();
1527
                    } else {
1528
                        if (this.dd) {
1529
                            if (dd) {
1530
                                //activating an old DD instance..
1531
                                D.addClass(this._wrap, this.CSS_DRAG);
1532
                                this.dd.DDM.regDragDrop(this.dd, "default");
1533
                            } else {
1534
                                D.removeClass(this._wrap, this.CSS_DRAG);
1535
                                this.dd.unreg();
1536
                            }
1537
                        }
1538
                    }
1539
                }
1540
            });
1541
 
1542
            /**
1543
            * @attribute hover
1544
            * @description Only show the handles when they are being moused over.
1545
            * @type Boolean
1546
            */
1547
            this.setAttributeConfig('hover', {
1548
                value: attr.hover || false,
1549
                validator: YAHOO.lang.isBoolean
1550
            });
1551
 
1552
            /**
1553
            * @attribute hiddenHandles
1554
            * @description Don't show the handles, just use the cursor to the user.
1555
            * @type Boolean
1556
            */
1557
            this.setAttributeConfig('hiddenHandles', {
1558
                value: attr.hiddenHandles || false,
1559
                validator: YAHOO.lang.isBoolean
1560
            });
1561
 
1562
            /**
1563
            * @attribute knobHandles
1564
            * @description Use the smaller handles, instead if the full size handles.
1565
            * @type Boolean
1566
            */
1567
            this.setAttributeConfig('knobHandles', {
1568
                value: attr.knobHandles || false,
1569
                validator: YAHOO.lang.isBoolean
1570
            });
1571
 
1572
            /**
1573
            * @attribute xTicks
1574
            * @description The number of x ticks to span the resize to.
1575
            * @type Number or False
1576
            */
1577
            this.setAttributeConfig('xTicks', {
1578
                value: attr.xTicks || false
1579
            });
1580
 
1581
            /**
1582
            * @attribute yTicks
1583
            * @description The number of y ticks to span the resize to.
1584
            * @type Number or False
1585
            */
1586
            this.setAttributeConfig('yTicks', {
1587
                value: attr.yTicks || false
1588
            });
1589
 
1590
            /**
1591
            * @attribute status
1592
            * @description Show the status (new size) of the resize.
1593
            * @type Boolean
1594
            */
1595
            this.setAttributeConfig('status', {
1596
                value: attr.status || false,
1597
                validator: YAHOO.lang.isBoolean
1598
            });
1599
 
1600
            /**
1601
            * @attribute autoRatio
1602
            * @description Using the shift key during a resize will toggle the ratio config.
1603
            * @type Boolean
1604
            */
1605
            this.setAttributeConfig('autoRatio', {
1606
                value: attr.autoRatio || false,
1607
                validator: YAHOO.lang.isBoolean
1608
            });
1609
 
1610
        },
1611
        /**
1612
        * @method destroy
1613
        * @description Destroys the resize object and all of it's elements & listeners.
1614
        */
1615
        destroy: function() {
1616
            for (var h in this._handles) {
1617
                if (Lang.hasOwnProperty(this._handles, h)) {
1618
                    Event.purgeElement(this._handles[h]);
1619
                    this._handles[h].parentNode.removeChild(this._handles[h]);
1620
                }
1621
            }
1622
            if (this._proxy) {
1623
                this._proxy.parentNode.removeChild(this._proxy);
1624
            }
1625
            if (this._status) {
1626
                this._status.parentNode.removeChild(this._status);
1627
            }
1628
            if (this.dd) {
1629
                this.dd.unreg();
1630
                D.removeClass(this._wrap, this.CSS_DRAG);
1631
            }
1632
            if (this._wrap != this.get('element')) {
1633
                this.setStyle('position', (this._positioned ? 'absolute' : 'relative'));
1634
                this.setStyle('top', D.getStyle(this._wrap, 'top'));
1635
                this.setStyle('left',D.getStyle(this._wrap, 'left'));
1636
                this._wrap.parentNode.replaceChild(this.get('element'), this._wrap);
1637
            }
1638
            this.removeClass(this.CSS_RESIZE);
1639
 
1640
            delete YAHOO.util.Resize._instances[this.get('id')];
1641
            //Brutal Object Destroy
1642
            for (var i in this) {
1643
                if (Lang.hasOwnProperty(this, i)) {
1644
                    this[i] = null;
1645
                    delete this[i];
1646
                }
1647
            }
1648
        },
1649
        /**
1650
        * @method toString
1651
        * @description Returns a string representing the Resize Object.
1652
        * @return {String}
1653
        */
1654
        toString: function() {
1655
            if (this.get) {
1656
                return 'Resize (#' + this.get('id') + ')';
1657
            }
1658
            return 'Resize Utility';
1659
        }
1660
    });
1661
 
1662
    YAHOO.util.Resize = Resize;
1663
 
1664
/**
1665
* @event dragEvent
1666
* @description Fires when the <a href="YAHOO.util.DragDrop.html">YAHOO.util.DragDrop</a> dragEvent is fired for the config option draggable.
1667
* @type YAHOO.util.CustomEvent
1668
*/
1669
/**
1670
* @event startResize
1671
* @description Fires when a resize action is started.
1672
* @type YAHOO.util.CustomEvent
1673
*/
1674
/**
1675
* @event endResize
1676
* @description Fires when the mouseUp event from the Drag Instance fires.
1677
* @type YAHOO.util.CustomEvent
1678
*/
1679
/**
1680
* @event resize
1681
* @description Fires on every element resize (only fires once when used with proxy config setting).
1682
* @type YAHOO.util.CustomEvent
1683
*/
1684
/**
1685
* @event beforeResize
1686
* @description Fires before every element resize after the size calculations, returning false will stop the resize.
1687
* @type YAHOO.util.CustomEvent
1688
*/
1689
/**
1690
* @event proxyResize
1691
* @description Fires on every proxy resize (only fires when used with proxy config setting).
1692
* @type YAHOO.util.CustomEvent
1693
*/
1694
 
1695
})();
1696
 
1697
YAHOO.register("resize", YAHOO.util.Resize, {version: "2.9.0", build: "2800"});
1698
 
1699
}, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-dom", "yui2-event", "yui2-dragdrop", "yui2-element", "yui2-skin-sam-resize"], "optional": ["yui2-animation"]});