Trunk updated to 0.9 git-svn-id: http://kusabax.cultnet.net/svn/repo/stable@176 73d99b7e-4f53-4972-b7b7-2ecd3c4d89ee
216 lines
7.8 KiB
JavaScript
216 lines
7.8 KiB
JavaScript
// Copyright (c) 2005 Thomas Fakes (http://craz8.com)
|
|
//
|
|
// This code is substantially based on code from script.aculo.us which has the
|
|
// following copyright and permission notice
|
|
//
|
|
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
var Resizeable = Class.create();
|
|
Resizeable.prototype = {
|
|
initialize: function(element) {
|
|
var options = Object.extend({
|
|
top: 6,
|
|
bottom: 6,
|
|
left: 6,
|
|
right: 6,
|
|
minHeight: 0,
|
|
minWidth: 0,
|
|
zindex: 1000,
|
|
resize: null
|
|
}, arguments[1] || {});
|
|
|
|
this.element = $(element);
|
|
this.handle = this.element;
|
|
|
|
Element.makePositioned(this.element); // fix IE
|
|
|
|
this.options = options;
|
|
|
|
this.active = false;
|
|
this.resizing = false;
|
|
this.currentDirection = '';
|
|
|
|
this.eventMouseDown = this.startResize.bindAsEventListener(this);
|
|
this.eventMouseUp = this.endResize.bindAsEventListener(this);
|
|
this.eventMouseMove = this.update.bindAsEventListener(this);
|
|
this.eventCursorCheck = this.cursor.bindAsEventListener(this);
|
|
this.eventKeypress = this.keyPress.bindAsEventListener(this);
|
|
|
|
this.registerEvents();
|
|
},
|
|
destroy: function() {
|
|
Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
|
|
this.unregisterEvents();
|
|
},
|
|
registerEvents: function() {
|
|
Event.observe(document, "mouseup", this.eventMouseUp);
|
|
Event.observe(document, "mousemove", this.eventMouseMove);
|
|
Event.observe(document, "keypress", this.eventKeypress);
|
|
Event.observe(this.handle, "mousedown", this.eventMouseDown);
|
|
Event.observe(this.element, "mousemove", this.eventCursorCheck);
|
|
},
|
|
unregisterEvents: function() {
|
|
//if(!this.active) return;
|
|
//Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
|
//Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
|
//Event.stopObserving(document, "mousemove", this.eventCursorCheck);
|
|
//Event.stopObserving(document, "keypress", this.eventKeypress);
|
|
},
|
|
startResize: function(event) {
|
|
if(Event.isLeftClick(event)) {
|
|
|
|
// abort on form elements, fixes a Firefox issue
|
|
var src = Event.element(event);
|
|
if(src.tagName && (
|
|
src.tagName=='INPUT' ||
|
|
src.tagName=='SELECT' ||
|
|
src.tagName=='BUTTON' ||
|
|
src.tagName=='TEXTAREA')) return;
|
|
|
|
var dir = this.directions(event);
|
|
if (dir.length > 0) {
|
|
this.active = true;
|
|
var offsets = Position.cumulativeOffset(this.element);
|
|
this.startTop = offsets[1];
|
|
this.startLeft = offsets[0];
|
|
this.startWidth = parseInt(Element.getStyle(this.element, 'width'));
|
|
this.startHeight = parseInt(Element.getStyle(this.element, 'height'));
|
|
this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
|
|
this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
|
|
|
|
this.currentDirection = dir;
|
|
Event.stop(event);
|
|
}
|
|
}
|
|
},
|
|
finishResize: function(event, success) {
|
|
// this.unregisterEvents();
|
|
|
|
this.active = false;
|
|
this.resizing = false;
|
|
|
|
if(this.options.zindex)
|
|
this.element.style.zIndex = this.originalZ;
|
|
|
|
if (this.options.resize) {
|
|
this.options.resize(this.element);
|
|
}
|
|
},
|
|
keyPress: function(event) {
|
|
if(this.active) {
|
|
if(event.keyCode==Event.KEY_ESC) {
|
|
this.finishResize(event, false);
|
|
Event.stop(event);
|
|
}
|
|
}
|
|
},
|
|
endResize: function(event) {
|
|
if(this.active && this.resizing) {
|
|
this.finishResize(event, true);
|
|
Event.stop(event);
|
|
}
|
|
this.active = false;
|
|
this.resizing = false;
|
|
},
|
|
draw: function(event) {
|
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
|
var style = this.element.style;
|
|
if (this.currentDirection.indexOf('n') != -1) {
|
|
var pointerMoved = this.startY - pointer[1];
|
|
var margin = Element.getStyle(this.element, 'margin-top') || "0";
|
|
var newHeight = this.startHeight + pointerMoved;
|
|
if (newHeight > this.options.minHeight) {
|
|
style.height = newHeight + "px";
|
|
style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";
|
|
}
|
|
}
|
|
if (this.currentDirection.indexOf('w') != -1) {
|
|
var pointerMoved = this.startX - pointer[0];
|
|
var margin = Element.getStyle(this.element, 'margin-left') || "0";
|
|
var newWidth = this.startWidth + pointerMoved;
|
|
if (newWidth > this.options.minWidth) {
|
|
style.left = (this.startLeft - pointerMoved - parseInt(margin)) + "px";
|
|
style.width = newWidth + "px";
|
|
}
|
|
}
|
|
if (this.currentDirection.indexOf('s') != -1) {
|
|
var newHeight = this.startHeight + pointer[1] - this.startY;
|
|
if (newHeight > this.options.minHeight) {
|
|
style.height = newHeight + "px";
|
|
}
|
|
}
|
|
if (this.currentDirection.indexOf('e') != -1) {
|
|
var newWidth = this.startWidth + pointer[0] - this.startX;
|
|
if (newWidth > this.options.minWidth) {
|
|
style.width = newWidth + "px";
|
|
}
|
|
}
|
|
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
|
},
|
|
between: function(val, low, high) {
|
|
return (val >= low && val < high);
|
|
},
|
|
directions: function(event) {
|
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
|
var offsets = Position.cumulativeOffset(this.element);
|
|
|
|
var cursor = '';
|
|
if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n';
|
|
if (this.between((offsets[1] + this.element.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's';
|
|
if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w';
|
|
if (this.between((offsets[0] + this.element.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e';
|
|
|
|
return cursor;
|
|
},
|
|
cursor: function(event) {
|
|
var cursor = this.directions(event);
|
|
if (cursor.length > 0) {
|
|
cursor += '-resize';
|
|
} else {
|
|
cursor = '';
|
|
}
|
|
this.element.style.cursor = cursor;
|
|
},
|
|
update: function(event) {
|
|
if(this.active) {
|
|
if(!this.resizing) {
|
|
var style = this.element.style;
|
|
this.resizing = true;
|
|
|
|
if(Element.getStyle(this.element,'position')=='')
|
|
style.position = "relative";
|
|
|
|
if(this.options.zindex) {
|
|
this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
|
|
style.zIndex = this.options.zindex;
|
|
}
|
|
}
|
|
this.draw(event);
|
|
|
|
// fix AppleWebKit rendering
|
|
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
|
Event.stop(event);
|
|
return false;
|
|
}
|
|
}
|
|
}
|