2011-07-29 18:48:43 +00:00
|
|
|
// vim: et:ts=4:sw=4:sts=4:ft=javascript
|
2011-05-16 08:24:46 +00:00
|
|
|
/*@
|
2011-08-15 12:25:58 +00:00
|
|
|
Ox.Dialog <f:Ox.Element> Dialog object
|
|
|
|
() -> <f> Dialog object
|
|
|
|
(options) -> <f> Dialog object
|
|
|
|
(options, self) -> <f> Dialog object
|
2011-05-16 08:24:46 +00:00
|
|
|
options <o> Options object
|
2011-08-15 12:18:14 +00:00
|
|
|
draggable <b|true> is window draggable
|
|
|
|
fullscreenable <b|true> fixme: silly name
|
2011-08-15 12:25:58 +00:00
|
|
|
height <n|200> height
|
2011-08-15 12:18:14 +00:00
|
|
|
resizeable <b|true> resizeable
|
|
|
|
scaleable <b|true> sccaleable
|
|
|
|
width <n|400> width
|
|
|
|
self <o> Shared private variable
|
2011-05-16 08:24:46 +00:00
|
|
|
@*/
|
|
|
|
|
2011-04-22 22:03:10 +00:00
|
|
|
Ox.Dialog = function(options, self) {
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
// fixme: use controlsTop/controlsBottom options, like in VideoPlayer (????)
|
|
|
|
|
2011-06-19 17:48:32 +00:00
|
|
|
self = self || {};
|
|
|
|
var that = Ox.Element({}, self)
|
2011-04-22 22:03:10 +00:00
|
|
|
.defaults({
|
|
|
|
buttons: [],
|
2011-08-15 12:18:14 +00:00
|
|
|
controlsBottom: [],
|
|
|
|
controlsTop: [],
|
|
|
|
closeButton: false,
|
2011-04-22 22:03:10 +00:00
|
|
|
content: null,
|
2011-08-15 12:18:14 +00:00
|
|
|
fixedCenter: false,
|
|
|
|
fixedSize: false,
|
|
|
|
fixedRatio: false,
|
2011-06-07 05:29:14 +00:00
|
|
|
focus: true,
|
2011-08-15 12:18:14 +00:00
|
|
|
height: 200,
|
2011-08-17 11:39:33 +00:00
|
|
|
keys: {},
|
2011-08-15 12:18:14 +00:00
|
|
|
maxHeight: Infinity,
|
|
|
|
maximizeButton: false,
|
|
|
|
maxWidth: Infinity,
|
|
|
|
minHeight: 64,
|
|
|
|
minWidth: 128,
|
|
|
|
title: '',
|
|
|
|
width: 400
|
2011-04-22 22:03:10 +00:00
|
|
|
})
|
|
|
|
.options(options || {})
|
2011-08-15 12:25:58 +00:00
|
|
|
.addClass('OxDialog')
|
2011-08-17 11:39:33 +00:00
|
|
|
.bindEvent({
|
|
|
|
key_enter: function() {
|
|
|
|
keypress('enter');
|
|
|
|
},
|
|
|
|
key_escape: function() {
|
|
|
|
keypress('escape');
|
|
|
|
}
|
|
|
|
})
|
2011-08-15 12:18:14 +00:00
|
|
|
.hide()
|
|
|
|
.appendTo(Ox.UI.$body);
|
|
|
|
|
|
|
|
self.hasButtons = !!self.options.buttons.length;
|
|
|
|
self.barsHeight = 24 + 24 * self.hasButtons;
|
2011-08-15 16:41:54 +00:00
|
|
|
self.initialMaxHeight = self.options.maxHeight;
|
|
|
|
self.initialMaxWidth = self.options.maxWidth;
|
2011-08-15 12:18:14 +00:00
|
|
|
self.titleMargin = 8 + (self.options.closeButton ? 20 : 0)
|
|
|
|
+ (self.options.maximizeButton ? 20 : 0);
|
|
|
|
|
|
|
|
if (self.options.focus) {
|
|
|
|
self.$layer = Ox.Element() // fixme: Layer widget that would handle click?
|
|
|
|
.addClass('OxLayer')
|
|
|
|
.mousedown(mousedownLayer)
|
|
|
|
.mouseup(mouseupLayer)
|
|
|
|
.hide()
|
|
|
|
.appendTo(Ox.UI.$body);
|
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$box = $('<div>')
|
|
|
|
.addClass('OxDialogBox')
|
|
|
|
.css({zIndex: 11});
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$titlebar = Ox.Bar({
|
|
|
|
size: 24
|
2011-04-22 22:03:10 +00:00
|
|
|
})
|
2011-08-15 12:18:14 +00:00
|
|
|
.addClass('OxTitlebar')
|
2011-04-22 22:03:10 +00:00
|
|
|
.appendTo(that);
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
if (self.options.closeButton) {
|
|
|
|
self.$closeButton = Ox.Button({
|
|
|
|
title: 'close',
|
|
|
|
type: 'image'
|
|
|
|
})
|
|
|
|
.css({
|
|
|
|
top: '4px',
|
|
|
|
left: '4px'
|
|
|
|
})
|
|
|
|
.bindEvent({
|
|
|
|
click: function() {
|
|
|
|
that.close();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.appendTo(self.$titlebar);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (self.options.maximizeButton) {
|
|
|
|
self.$maximizeButton = Ox.Button({
|
|
|
|
title: [
|
|
|
|
{id: 'add', title: 'add'},
|
|
|
|
{id: 'remove', title: 'remove'}
|
|
|
|
],
|
|
|
|
type: 'image'
|
|
|
|
})
|
|
|
|
.css({
|
|
|
|
top: '4px',
|
|
|
|
left: '24px'
|
|
|
|
})
|
|
|
|
.bindEvent({
|
|
|
|
click: maximize
|
|
|
|
})
|
|
|
|
.appendTo(self.$titlebar);
|
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$title = Ox.Element()
|
|
|
|
.addClass('OxTitle')
|
2011-04-22 22:03:10 +00:00
|
|
|
.css({
|
2011-08-15 12:18:14 +00:00
|
|
|
marginLeft: self.titleMargin + 'px',
|
|
|
|
marginRight: self.titleMargin + 'px'
|
2011-04-22 22:03:10 +00:00
|
|
|
})
|
2011-08-15 12:18:14 +00:00
|
|
|
.html(self.options.title)
|
|
|
|
.appendTo(self.$titlebar);
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
setContent();
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
if (self.hasButtons) {
|
|
|
|
self.$buttonsbar = Ox.Bar({
|
|
|
|
size: 24
|
|
|
|
})
|
|
|
|
.addClass('OxButtonsbar')
|
|
|
|
.appendTo(that);
|
|
|
|
self.$buttonsLeft = $('<div>')
|
|
|
|
.addClass('OxButtonsLeft')
|
|
|
|
.appendTo(self.$buttonsbar.$element);
|
|
|
|
self.$buttonsRight = $('<div>')
|
|
|
|
.addClass('OxButtonsRight')
|
|
|
|
.appendTo(self.$buttonsbar.$element);
|
2011-08-17 11:39:33 +00:00
|
|
|
setButtons();
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
if (!self.options.fixedCenter) {
|
|
|
|
self.$titlebar.css({
|
|
|
|
cursor: 'move'
|
|
|
|
})
|
|
|
|
.bindEvent({
|
|
|
|
doubleclick: function() {
|
|
|
|
!self.centered && center(true);
|
|
|
|
},
|
|
|
|
dragstart: dragstart,
|
|
|
|
drag: drag,
|
|
|
|
dragend: dragend,
|
|
|
|
});
|
|
|
|
self.hasButtons && self.$buttonsbar.css({
|
|
|
|
cursor: 'move'
|
|
|
|
})
|
|
|
|
.bindEvent({
|
|
|
|
doubleclick: function() {
|
|
|
|
!self.centered && center(true);
|
|
|
|
},
|
|
|
|
dragstart: dragstart,
|
|
|
|
drag: drag,
|
|
|
|
dragend: dragend
|
|
|
|
});
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
!self.options.fixedSize && [
|
|
|
|
'TopLeft', 'Top', 'TopRight', 'Left', 'Right', 'BottomLeft', 'Bottom', 'BottomRight'
|
|
|
|
].forEach(function(edge) {
|
|
|
|
Ox.Element()
|
|
|
|
.addClass('OxResize OxResize' + edge)
|
|
|
|
.bindEvent({
|
|
|
|
doubleclick: function() {
|
|
|
|
reset(true);
|
|
|
|
},
|
|
|
|
dragstart: resizestart,
|
|
|
|
drag: resize,
|
|
|
|
dragend: resizeend
|
|
|
|
})
|
|
|
|
.appendTo(that);
|
|
|
|
});
|
|
|
|
|
|
|
|
function center(animate) {
|
|
|
|
var ms = animate ? 100 : 0;
|
|
|
|
self.centered && decenter();
|
|
|
|
that.animate({
|
|
|
|
left: Math.round(
|
|
|
|
(window.innerWidth - self.options.width) / 2
|
|
|
|
) + 'px',
|
|
|
|
top: Math.round(
|
|
|
|
(window.innerHeight - self.options.height - self.barsHeight) * 0.4
|
|
|
|
) + 'px',
|
|
|
|
width: self.options.width + 'px',
|
|
|
|
height: self.options.height + self.barsHeight + 'px'
|
|
|
|
}, ms, function() {
|
|
|
|
that.css({
|
|
|
|
left: 0,
|
|
|
|
top: 0,
|
|
|
|
right: 0,
|
|
|
|
bottom: Math.round(
|
|
|
|
(window.innerHeight - self.options.height - self.barsHeight) * 0.2
|
|
|
|
) + 'px',
|
|
|
|
margin: 'auto'
|
|
|
|
});
|
|
|
|
self.centered = true;
|
|
|
|
Ox.isFunction(animate) && animate();
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function decenter() {
|
|
|
|
var offset = that.offset();
|
|
|
|
if (self.centered) {
|
|
|
|
that.css({
|
|
|
|
left: offset.left + 'px',
|
|
|
|
top: offset.top + 'px',
|
|
|
|
margin: 0
|
|
|
|
});
|
|
|
|
self.centered = false;
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function dragstart(event) {
|
|
|
|
var offset;
|
|
|
|
if (!$(event.target).is('.OxButton')) {
|
|
|
|
offset = that.offset();
|
|
|
|
self.drag = {
|
|
|
|
left: offset.left,
|
|
|
|
top: offset.top,
|
|
|
|
x: event.clientX,
|
|
|
|
y: event.clientY
|
|
|
|
};
|
|
|
|
decenter();
|
|
|
|
that.wrap(self.$box);
|
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function drag(event) {
|
|
|
|
Ox.print(document.body.scrollTop, '...')
|
2011-09-19 13:17:35 +00:00
|
|
|
var left, top;
|
|
|
|
if (!$(event.target).is('.OxButton')) {
|
|
|
|
left = Ox.limit(
|
2011-08-15 12:18:14 +00:00
|
|
|
self.drag.left - self.drag.x + event.clientX,
|
|
|
|
self.minLeft, self.maxLeft
|
2011-09-19 13:17:35 +00:00
|
|
|
);
|
2011-08-15 12:18:14 +00:00
|
|
|
top = Ox.limit(
|
|
|
|
self.drag.top - self.drag.y + event.clientY,
|
|
|
|
self.minTop, self.maxTop
|
|
|
|
);
|
2011-09-19 13:17:35 +00:00
|
|
|
setCSS({
|
|
|
|
left: left,
|
|
|
|
top: top
|
|
|
|
});
|
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function dragend() {
|
|
|
|
that.unwrap();
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-17 11:39:33 +00:00
|
|
|
function getButtonById(id) {
|
|
|
|
var ret = null;
|
|
|
|
Ox.forEach(self.options.buttons, function(button) {
|
2011-09-29 17:25:50 +00:00
|
|
|
//Ox.print(button.options(), button.options('id'))
|
2011-08-17 11:39:33 +00:00
|
|
|
if (button.options && button.options('id') == id) {
|
|
|
|
ret = button;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
function keypress(key) {
|
|
|
|
var id = self.options.keys[key];
|
2011-09-28 17:31:35 +00:00
|
|
|
Ox.print(id, getButtonById(id));
|
2011-08-17 11:39:33 +00:00
|
|
|
id && getButtonById(id).$element.trigger('click');
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function maximize() {
|
|
|
|
var offset = that.offset();
|
|
|
|
decenter();
|
|
|
|
if (!self.maximized) {
|
|
|
|
self.originalLeft = offset.left;
|
|
|
|
self.originalTop = offset.top;
|
|
|
|
self.originalWidth = self.options.width;
|
|
|
|
self.originalHeight = self.options.height;
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
2011-08-15 12:18:14 +00:00
|
|
|
setCSS(self.maximized ? {
|
|
|
|
left: self.originalLeft,
|
|
|
|
top: self.originalTop,
|
|
|
|
width: self.originalWidth,
|
|
|
|
height: self.originalHeight
|
|
|
|
} : {
|
|
|
|
left: Math.round((window.innerWidth - self.options.maxWidth) / 2),
|
|
|
|
top: Math.round((window.innerHeight - self.options.maxHeight - self.barsHeight) / 2),
|
|
|
|
width: self.options.maxWidth,
|
|
|
|
height: self.options.maxHeight
|
|
|
|
}, true);
|
|
|
|
self.maximized = !self.maximized;
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function mousedownLayer() {
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$layer.stop().animate({
|
2011-04-22 22:03:10 +00:00
|
|
|
opacity: 0.5
|
|
|
|
}, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
function mouseupLayer() {
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$layer.stop().animate({
|
2011-04-22 22:03:10 +00:00
|
|
|
opacity: 0
|
|
|
|
}, 0);
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function reset(animate) {
|
|
|
|
var offset, left, top;
|
|
|
|
if (!self.centered) {
|
|
|
|
offset = that.offset();
|
|
|
|
left = Ox.limit(
|
|
|
|
offset.left + Math.round((self.options.width - self.initialWidth) / 2),
|
|
|
|
self.minLeft, self.maxLeft
|
|
|
|
);
|
|
|
|
top = Ox.limit(
|
|
|
|
offset.top + Math.round((self.options.height - self.initialHeight) / 2),
|
|
|
|
self.minTop, self.maxTop
|
|
|
|
);
|
|
|
|
}
|
|
|
|
setCSS(Ox.extend({
|
|
|
|
width: self.initialWidth,
|
|
|
|
height: self.initialHeight
|
|
|
|
}, self.centered ? {} : {
|
|
|
|
left: left,
|
|
|
|
top: top
|
|
|
|
}), animate);
|
2011-04-22 22:03:10 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function resizestart(event) {
|
|
|
|
var edge = event.target.className.substr(17).toLowerCase(),
|
|
|
|
offset = that.offset();
|
|
|
|
self.drag = {
|
|
|
|
edge: edge,
|
|
|
|
height: self.options.height,
|
|
|
|
isLeft: edge.indexOf('left') > -1,
|
|
|
|
isTop: edge.indexOf('top') > -1,
|
|
|
|
isRight: edge.indexOf('right') > -1,
|
|
|
|
isBottom: edge.indexOf('bottom') > -1,
|
|
|
|
left: offset.left,
|
|
|
|
top: offset.top,
|
|
|
|
width: self.options.width
|
|
|
|
};
|
|
|
|
decenter();
|
|
|
|
if (self.maximized) {
|
|
|
|
self.$maximizeButton.toggleTitle();
|
|
|
|
self.maximized = false;
|
|
|
|
}
|
|
|
|
that.wrap(self.$box);
|
|
|
|
}
|
|
|
|
|
|
|
|
function resize(event) {
|
|
|
|
var ratio = self.drag.width / self.drag.height, horizontal, vertical;
|
|
|
|
if (!self.drag.fixedRatio && event.shiftKey) {
|
|
|
|
self.drag.centerX = Math.round(self.drag.left + self.drag.width / 2);
|
|
|
|
self.drag.centerY = Math.round(self.drag.top + self.drag.height / 2);
|
|
|
|
}
|
|
|
|
self.drag.fixedCenter = self.options.fixedCenter || event.altKey;
|
|
|
|
self.drag.fixedRatio = self.options.fixedRatio || event.shiftKey;
|
|
|
|
horizontal = self.drag.edge == 'left' || self.drag.edge == 'right'
|
|
|
|
|| ratio >= 1 || !self.drag.fixedRatio;
|
|
|
|
vertical = self.drag.edge == 'top' || self.drag.edge == 'bottom'
|
|
|
|
|| ratio < 1 || !self.drag.fixedRatio;
|
|
|
|
if (self.drag.isLeft && horizontal) {
|
|
|
|
self.options.width = Ox.limit(
|
|
|
|
self.options.width + (
|
|
|
|
self.drag.left - Math.min(event.clientX, self.maxLeft)
|
|
|
|
) * (self.drag.fixedCenter ? 2 : 1),
|
|
|
|
self.options.minWidth,
|
|
|
|
self.options.maxWidth
|
|
|
|
);
|
|
|
|
if (self.drag.fixedRatio) {
|
|
|
|
self.options.height = Ox.limit(
|
|
|
|
Math.round(self.options.width / ratio),
|
|
|
|
self.options.minHeight,
|
|
|
|
self.options.maxHeight
|
|
|
|
);
|
|
|
|
self.options.width = Math.round(self.options.height * ratio);
|
|
|
|
}
|
|
|
|
setCSS(Ox.extend({
|
|
|
|
left: self.drag.left + (
|
|
|
|
self.drag.width - self.options.width
|
|
|
|
) / (self.drag.fixedCenter ? 2 : 1),
|
|
|
|
width: self.options.width,
|
|
|
|
}, self.drag.fixedRatio ? {
|
|
|
|
top: Math.max(Math.round(
|
|
|
|
self.drag.edge == 'topleft'
|
|
|
|
? self.drag.top + self.drag.height - self.options.height
|
|
|
|
: self.drag.edge == 'bottomleft'
|
|
|
|
? self.drag.top
|
|
|
|
: self.drag.centerY - self.options.height / 2
|
|
|
|
), self.minTop),
|
|
|
|
height: self.options.height
|
|
|
|
} : {}));
|
|
|
|
}
|
|
|
|
if (self.drag.isTop && vertical) {
|
|
|
|
self.options.height = Ox.limit(
|
|
|
|
self.options.height + (
|
|
|
|
self.drag.top - Ox.limit(event.clientY, self.minTop, self.maxTop)
|
|
|
|
) * (self.drag.fixedCenter ? 2 : 1),
|
|
|
|
self.options.minHeight,
|
|
|
|
self.options.maxHeight
|
|
|
|
);
|
|
|
|
if (self.drag.fixedRatio) {
|
|
|
|
self.options.width = Ox.limit(
|
|
|
|
Math.round(self.options.height * ratio),
|
|
|
|
self.options.minWidth,
|
|
|
|
self.options.maxWidth
|
|
|
|
);
|
|
|
|
self.options.height = Math.round(self.options.width / ratio);
|
|
|
|
}
|
|
|
|
setCSS(Ox.extend({
|
|
|
|
top: Math.max(self.drag.top + (
|
|
|
|
self.drag.height - self.options.height
|
|
|
|
) / (self.drag.fixedCenter ? 2 : 1), self.minTop),
|
|
|
|
height: self.options.height,
|
|
|
|
}, (self.drag.fixedRatio) ? {
|
|
|
|
left: Math.round(
|
|
|
|
self.drag.edge == 'topleft'
|
|
|
|
? self.drag.left + self.drag.width - self.options.width
|
|
|
|
: self.drag.edge == 'topright'
|
|
|
|
? self.drag.left
|
|
|
|
: self.drag.centerX - self.options.width / 2
|
|
|
|
),
|
|
|
|
width: self.options.width
|
|
|
|
} : {}));
|
|
|
|
}
|
|
|
|
if (self.drag.isRight && horizontal) {
|
|
|
|
self.options.width = Ox.limit(
|
|
|
|
self.options.width + (
|
|
|
|
Math.max(event.clientX, 24) - self.drag.left - self.drag.width
|
|
|
|
) * (self.drag.fixedCenter ? 2 : 1),
|
|
|
|
self.options.minWidth,
|
|
|
|
self.options.maxWidth
|
|
|
|
);
|
|
|
|
if (self.drag.fixedRatio) {
|
|
|
|
self.options.height = Ox.limit(
|
|
|
|
Math.round(self.options.width / ratio),
|
|
|
|
self.options.minHeight,
|
|
|
|
self.options.maxHeight
|
|
|
|
);
|
|
|
|
self.options.width = Math.round(self.options.height * ratio);
|
|
|
|
}
|
|
|
|
setCSS(Ox.extend({
|
|
|
|
width: self.options.width,
|
|
|
|
}, self.drag.fixedCenter ? {
|
|
|
|
left: self.drag.left + (
|
|
|
|
self.drag.width - self.options.width
|
|
|
|
) / 2
|
|
|
|
} : {}, self.drag.fixedRatio ? {
|
|
|
|
top: Math.max(Math.round(
|
|
|
|
self.drag.edge == 'topright'
|
|
|
|
? self.drag.top + self.drag.height - self.options.height
|
|
|
|
: self.drag.edge == 'bottomright'
|
|
|
|
? self.drag.top
|
|
|
|
: self.drag.centerY - self.options.height / 2
|
|
|
|
), self.minTop),
|
|
|
|
height: self.options.height
|
|
|
|
} : {}));
|
|
|
|
}
|
|
|
|
if (self.drag.isBottom && vertical) {
|
|
|
|
self.options.height = Ox.limit(
|
|
|
|
self.options.height + (
|
|
|
|
Math.max(event.clientY, 24) - self.drag.top - self.drag.height - self.barsHeight
|
|
|
|
) * (self.drag.fixedCenter ? 2 : 1),
|
|
|
|
self.options.minHeight,
|
|
|
|
self.options.maxHeight
|
|
|
|
);
|
|
|
|
if (self.drag.fixedRatio) {
|
|
|
|
self.options.width = Ox.limit(
|
|
|
|
Math.round(self.options.height * ratio),
|
|
|
|
self.options.minWidth,
|
|
|
|
self.options.maxWidth
|
|
|
|
);
|
|
|
|
self.options.height = Math.round(self.options.width / ratio);
|
|
|
|
}
|
|
|
|
setCSS(Ox.extend({
|
|
|
|
height: self.options.height,
|
|
|
|
}, self.drag.fixedCenter ? {
|
|
|
|
top: Math.max(self.drag.top + (
|
|
|
|
self.drag.height - self.options.height
|
|
|
|
) / 2, self.minTop)
|
|
|
|
} : {}, self.drag.fixedRatio && self.drag.edge == 'bottom' ? {
|
|
|
|
left: Math.round(
|
|
|
|
self.drag.edge == 'bottomleft'
|
|
|
|
? self.drag.left + self.drag.width - self.options.width
|
|
|
|
: self.drag.edge == 'bottomright'
|
|
|
|
? self.drag.left
|
|
|
|
: self.drag.centerX - self.options.width / 2
|
|
|
|
),
|
|
|
|
width: self.options.width
|
|
|
|
} : {}));
|
|
|
|
}
|
|
|
|
var offset = that.offset();
|
|
|
|
self.drag.left = offset.left;
|
|
|
|
self.drag.top = offset.top;
|
|
|
|
self.drag.width = self.options.width;
|
|
|
|
self.drag.height = self.options.height;
|
|
|
|
self.drag.minLeft = 24 - self.options.width;
|
|
|
|
self.drag.minTop = self.hasButtons ? 24 - self.options.height - self.barsHeight : 0;
|
2011-04-22 22:03:10 +00:00
|
|
|
that.triggerEvent('resize', {
|
|
|
|
width: self.options.width,
|
|
|
|
height: self.options.height
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function resizeend() {
|
|
|
|
that.unwrap();
|
|
|
|
}
|
|
|
|
|
2011-08-17 11:39:33 +00:00
|
|
|
function setButtons() {
|
|
|
|
var buttonsLeft,
|
|
|
|
buttonsRight,
|
|
|
|
index = Ox.map(self.options.buttons, function(v, i) {
|
|
|
|
return Ox.isEmpty(v) ? i : null;
|
|
|
|
})[0];
|
|
|
|
if (index) {
|
|
|
|
buttonsLeft = Ox.sub(self.options.buttons, 0, index);
|
|
|
|
buttonsRight = Ox.sub(self.options.buttons, index + 1);
|
|
|
|
} else {
|
|
|
|
buttonsLeft = [];
|
|
|
|
buttonsRight = self.options.buttons;
|
|
|
|
}
|
|
|
|
self.$buttonsLeft.empty();
|
|
|
|
buttonsLeft.forEach(function($button) {
|
|
|
|
$button.addClass('OxLeft').appendTo(self.$buttonsLeft);
|
|
|
|
});
|
|
|
|
self.$buttonsRight.empty();
|
|
|
|
buttonsRight.forEach(function($button) {
|
|
|
|
$button.addClass('OxRight').appendTo(self.$buttonsRight);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function setContent() {
|
|
|
|
var animate = !!self.$content
|
|
|
|
isImage = !self.options.content.ox && self.options.content.is('img');
|
|
|
|
if (animate) {
|
|
|
|
self.$content.animate({
|
2011-04-22 22:03:10 +00:00
|
|
|
opacity: 0
|
2011-08-17 11:39:33 +00:00
|
|
|
}, 250, function() {
|
2011-08-15 12:18:14 +00:00
|
|
|
$(this).remove() // fixme: removeElement?
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
2011-08-15 12:18:14 +00:00
|
|
|
self.options.content.css({
|
2011-04-22 22:03:10 +00:00
|
|
|
opacity: 0
|
|
|
|
});
|
|
|
|
}
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$content = (isImage ? self.options.content : Ox.Element())
|
|
|
|
.addClass('OxContent')
|
|
|
|
.css(self.hasButtons ? {
|
|
|
|
bottom: '24px'
|
|
|
|
} : {
|
|
|
|
bottom: 0,
|
|
|
|
borderBottomLeftRadius: '8px',
|
|
|
|
borderBottomRightRadius: '8px'
|
|
|
|
})
|
|
|
|
.appendTo(that.$element);
|
|
|
|
!isImage && self.$content.append(
|
|
|
|
self.options.content.css(self.hasButtons ? {} : {
|
|
|
|
borderBottomLeftRadius: '8px',
|
|
|
|
borderBottomRightRadius: '8px'
|
|
|
|
})
|
|
|
|
);
|
|
|
|
animate && self.options.content.animate({
|
|
|
|
opacity: 1
|
2011-08-17 11:39:33 +00:00
|
|
|
}, 250);
|
2011-08-15 12:18:14 +00:00
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function setCSS(css, animate) {
|
|
|
|
var ms = animate ? 100 : 0,
|
|
|
|
offset = that.offset(),
|
|
|
|
triggerEvent = (css.width && css.width != self.options.width)
|
|
|
|
|| (css.height && css.height != self.options.height)
|
|
|
|
css = Ox.extend({
|
|
|
|
left: offset.left,
|
|
|
|
top: offset.top,
|
|
|
|
width: self.options.width,
|
|
|
|
height: self.options.height
|
|
|
|
}, css);
|
2011-04-22 22:03:10 +00:00
|
|
|
that.animate({
|
2011-08-15 12:18:14 +00:00
|
|
|
left: css.left + 'px',
|
|
|
|
top: css.top + 'px',
|
|
|
|
width: css.width + 'px',
|
|
|
|
height: css.height + self.barsHeight + 'px'
|
|
|
|
}, ms, function() {
|
|
|
|
self.options.width = css.width;
|
|
|
|
self.options.height = css.height;
|
|
|
|
self.minLeft = 24 - self.options.width;
|
|
|
|
self.minTop = self.hasButtons ? 24 - self.options.height - self.barsHeight : 0;
|
|
|
|
triggerEvent && that.triggerEvent('resize', {
|
|
|
|
width: self.options.width,
|
|
|
|
height: self.options.height
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
2011-08-15 12:18:14 +00:00
|
|
|
Ox.isFunction(animate) && animate();
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
2011-08-15 12:18:14 +00:00
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
function setMinAndMax() {
|
|
|
|
var ratio, maxRatio, minRatio;
|
|
|
|
self.maxLeft = window.innerWidth - 24;
|
|
|
|
self.maxTop = window.innerHeight - 24;
|
|
|
|
self.minLeft = 24 - self.options.width;
|
|
|
|
self.minTop = self.hasButtons ? 24 - self.options.height : 0;
|
|
|
|
self.options.maxHeight = Ox.limit(self.initialMaxHeight, 64, window.innerHeight - self.barsHeight);
|
|
|
|
self.options.maxWidth = Ox.limit(self.initialMaxWidth, 128, window.innerWidth);
|
|
|
|
if (self.options.fixedRatio) {
|
|
|
|
ratio = self.options.width / self.options.height;
|
|
|
|
maxRatio = self.options.maxWidth / self.options.maxHeight;
|
|
|
|
minRatio = self.options.minWidth / self.options.minHeight;
|
|
|
|
if (maxRatio > ratio) {
|
|
|
|
self.options.maxWidth = Math.round(self.options.maxHeight * ratio);
|
|
|
|
} else if (maxRatio < ratio) {
|
|
|
|
self.options.maxHeight = Math.round(self.options.maxWidth / ratio);
|
|
|
|
}
|
|
|
|
if (minRatio > ratio) {
|
|
|
|
self.options.minWidth = Math.round(self.options.minHeight * ratio);
|
|
|
|
} else if (minRatio < ratio) {
|
|
|
|
self.options.minHeight = Math.round(self.options.minWidth / ratio);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ox.print('sMM', self, window.innerHeight, maxRatio)
|
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
self.setOption = function(key, value) {
|
2011-08-17 11:39:33 +00:00
|
|
|
if (key == 'buttons') {
|
|
|
|
setButtons();
|
|
|
|
} else if (key == 'content') {
|
2011-08-15 12:18:14 +00:00
|
|
|
setContent();
|
2011-08-15 14:11:13 +00:00
|
|
|
} else if (key == 'height') {
|
|
|
|
setMinAndMax();
|
|
|
|
setCSS({height: value});
|
2011-08-15 12:18:14 +00:00
|
|
|
} else if (key == 'title') {
|
|
|
|
self.$title.animate({
|
|
|
|
opacity: 0
|
|
|
|
}, 50, function() {
|
|
|
|
self.$title.html(value).animate({
|
|
|
|
opacity: 1
|
|
|
|
}, 50);
|
|
|
|
});
|
2011-09-19 12:29:06 +00:00
|
|
|
} else if (key == 'width') {
|
2011-08-15 14:11:13 +00:00
|
|
|
setMinAndMax();
|
|
|
|
setCSS({width: value});
|
2011-08-15 12:18:14 +00:00
|
|
|
}
|
2011-04-22 22:03:10 +00:00
|
|
|
};
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
that.close = function(callback) {
|
|
|
|
that.animate({
|
|
|
|
opacity: 0
|
|
|
|
}, 100, function() {
|
|
|
|
//that.removeElement();
|
|
|
|
that.hide();
|
|
|
|
callback && callback();
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
2011-08-15 12:18:14 +00:00
|
|
|
if (self.maximized) {
|
|
|
|
self.$maximizeButton.toggleTitle();
|
|
|
|
self.maximized = false;
|
|
|
|
}
|
|
|
|
if (self.options.focus) {
|
|
|
|
self.$layer.hide();
|
|
|
|
that.loseFocus();
|
|
|
|
Ox.UI.$window.unbind({mouseup: mouseupLayer});
|
|
|
|
}
|
2011-08-15 14:11:13 +00:00
|
|
|
that.triggerEvent('close');
|
2011-04-22 22:03:10 +00:00
|
|
|
return that;
|
|
|
|
};
|
|
|
|
|
2011-08-17 11:39:33 +00:00
|
|
|
that.disableButton = function(id) {
|
|
|
|
getButtonById(id).options({disabled: true});
|
|
|
|
return that;
|
|
|
|
};
|
|
|
|
|
|
|
|
that.enableButton = function(id) {
|
|
|
|
getButtonById(id).options({disabled: false});
|
|
|
|
return that;
|
|
|
|
};
|
|
|
|
|
2011-04-22 22:03:10 +00:00
|
|
|
that.open = function() {
|
2011-08-15 14:11:13 +00:00
|
|
|
self.initialHeight = self.options.height;
|
|
|
|
self.initialWidth = self.options.width;
|
2011-08-15 12:18:14 +00:00
|
|
|
setMinAndMax();
|
|
|
|
center();
|
|
|
|
reset();
|
2011-04-22 22:03:10 +00:00
|
|
|
that.css({
|
|
|
|
opacity: 0
|
2011-08-15 12:18:14 +00:00
|
|
|
}).show().animate({
|
2011-04-22 22:03:10 +00:00
|
|
|
opacity: 1
|
2011-08-15 12:18:14 +00:00
|
|
|
}, 100);
|
2011-06-07 05:29:14 +00:00
|
|
|
if (self.options.focus) {
|
2011-08-15 12:18:14 +00:00
|
|
|
self.$layer.show();
|
2011-06-07 05:29:14 +00:00
|
|
|
that.gainFocus();
|
2011-08-15 12:18:14 +00:00
|
|
|
Ox.UI.$window.bind({mouseup: mouseupLayer});
|
2011-06-07 05:29:14 +00:00
|
|
|
}
|
2011-08-15 12:18:14 +00:00
|
|
|
Ox.UI.$window.bind({
|
|
|
|
resize: function() {
|
|
|
|
var offset = that.offset();
|
|
|
|
setMinAndMax();
|
|
|
|
if (self.centered) {
|
|
|
|
center();
|
|
|
|
} else {
|
|
|
|
that.css({
|
|
|
|
left: Math.min(offset.left, self.maxLeft) + 'px',
|
|
|
|
top: Math.min(offset.top, self.maxTop) + 'px'
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return that;
|
2011-04-22 22:03:10 +00:00
|
|
|
};
|
|
|
|
|
2011-08-15 12:18:14 +00:00
|
|
|
that.setSize = function(width, height) {
|
|
|
|
self.options.width = width;
|
|
|
|
self.options.height = height;
|
|
|
|
setMinAndMax();
|
|
|
|
if (self.maximized) {
|
2011-08-15 14:11:13 +00:00
|
|
|
self.originalWidth = width;
|
|
|
|
self.originalHeight = height;
|
2011-08-15 12:18:14 +00:00
|
|
|
self.options.width = self.options.maxWidth;
|
|
|
|
self.options.height = self.options.maxHeight;
|
|
|
|
}
|
|
|
|
center(true);
|
|
|
|
that.triggerEvent('resize', {
|
|
|
|
width: self.options.width,
|
|
|
|
height: self.options.height
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
2011-06-19 17:48:32 +00:00
|
|
|
};
|
2011-04-22 22:03:10 +00:00
|
|
|
|
|
|
|
return that;
|
|
|
|
|
|
|
|
};
|