(function ($) {
$.fn.lResize = function(options) {
this.each(function() {
$.lResize(this, options);
});
};
$.fn.lResizeBind = $.fn.lDragBind;
$.fn.lResizeHandleRule = function(options) {
this.each(function() {
options.handle = this;
$.lResize.handleRule(options);
});
};
$.lResize = function(container, options) {
/* OPTIONS
 * handle (object): resize handle
 * onStart (function): execute when start
 * onMove (function): execute when resizing
 * onComplete (function): execute when completed
 */
$.lResize.create(container, options);
};
$.lResize.extendNativeFunctionObject({
/* Resize direction */
HORIZONTAL : "horizontal",
VERTICAL : "vertical",
/* Resize modes */
ADD : "add",
SUBTRACT : "subtract",
resizeRule: function(container, direction, mode) {
this.container = container;
this.direction = direction;
this.next = null;
this.origWidth = null;
this.origHeight = null;
this.mode = mode;
},
handleRule: function(options) {
var handle = options.handle;
if (typeof handle == "string") {
handle = $(handle);
}
var settings = handle.resizeSettings;
if (!settings) {
$.lResize.create(settings.container, settings)
}
else {
settings.resizeRules.push(new $.lResize.resizeRule(
settings.container, settings.direction, settings.mode));
}
},
bind: function(container, type, fn) {
$.lDrag.bind(container, type, fn);
},
create: function(container, options) {
if (options.handle && options.direction && options.mode) {
    			if (typeof options.handle == "string") {
    				options.handle = $(options.handle)[0];
    			}
var handle = options.handle;
if (!handle.resizeSettings) {
handle.resizeSettings = options;
}
var settings = handle.resizeSettings;
if (!handle.dragSettings || !handle.dragSettings.isResizeHandle) {
$.lDrag.create(handle, {
onStart: $.lResize.onMouseDown,
onMove: $.lResize.onResize,
onComplete: $.lResize.onMouseUp,
noDrag: !options.drag,
isResizeHandle: true
});
}
var jHandle = $(handle);
jHandle.lDragBind("start", options.onStart);
jHandle.lDragBind("move", options.onMove);
jHandle.lDragBind("complete", options.onComplete);
if (!settings.resizeRules) {
settings.resizeRules = [];
}
settings.resizeRules.push(new $.lResize.resizeRule(container, options.direction, options.mode));
}
},
onMouseDown : function() {
var handle = $.lDrag.container;
var settings = handle.resizeSettings;
var mouse = mousePos;
settings.mouseStart = new Coordinate(mousePos.x, mousePos.y);
for (var i = 0; i < settings.resizeRules.length; i++) {
var resizeRule = settings.resizeRules[i];
var jContainer = $(resizeRule.container);
resizeRule.origWidth = jContainer.width();
resizeRule.origHeight = jContainer.height();
}
},
onResize: function() {
var handle = $.lDrag.container;
var settings = handle.resizeSettings;
var mouse = mousePos;
var mouseDelta = mousePos.minus(settings.mouseStart);
var newLength;
var lengthCorrection = 0;
var noChange = false;
for (var i = 0; i < settings.resizeRules.length; i++) {
var resizeRule = settings.resizeRules[i];
var jContainer = $(resizeRule.container);
if (resizeRule.direction == $.lResize.HORIZONTAL) {
resizeRule.prevLength = jContainer.width();
if (resizeRule.mode == $.lResize.ADD) {
newLength = resizeRule.origWidth + mouseDelta.x;
}
else {
newLength = resizeRule.origWidth - mouseDelta.x
}
}
else if (resizeRule.direction == $.lResize.VERTICAL) {
resizeRule.prevLength = jContainer.height();
if (resizeRule.mode == $.lResize.ADD) {
newLength = resizeRule.origHeight + mouseDelta.y;
}
else {
newLength = resizeRule.origHeight - mouseDelta.y;
}
}
resizeRule.newLength = newLength;
if (newLength < 1) {
lengthCorrection = Math.max(-newLength + 1, lengthCorrection);
newLength = 1;
}
if (newLength == resizeRule.prevLength) {
noChange = true;
}
}
for (var i = 0; i < settings.resizeRules.length; i++) {
var resizeRule = settings.resizeRules[i];
var jContainer = $(resizeRule.container);
if (!settings.disableStop && noChange) {
newLength = resizeRule.prevLength;
}
else if (resizeRule.newLength < 1) {
newLength = resizeRule.newLength + lengthCorrection;
}
else {
newLength = resizeRule.newLength - lengthCorrection;
}
if (resizeRule.direction == $.lResize.HORIZONTAL) {
jContainer.width(newLength);
}
else if (resizeRule.direction == $.lResize.VERTICAL) {
jContainer.height(newLength);
}
}
},
onMouseUp: function() {
var handle = $.lDrag.container;
var settings = handle.resizeSettings;
settings.mouseEnd = new Coordinate(mousePos.x, mousePos.y);
}
});
})(jQuery);