jquery-ui/ui/ui.magnifier.js

176 lines
4.9 KiB
JavaScript
Raw Normal View History

/*
* jQuery UI Magnifier @VERSION
*
* Copyright (c) 2008 jQuery
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Magnifier
*
* Depends:
* ui.core.js
*/
(function($) {
2008-07-15 01:32:24 +00:00
var counter = 0;
$.widget("ui.magnifier", {
2008-08-16 14:45:28 +00:00
_init: function() {
2008-07-15 01:32:24 +00:00
var self = this,
o = this.options;
2008-09-19 14:20:14 +00:00
2008-07-15 01:54:41 +00:00
this.element
.addClass("ui-magnifier")
.bind('click.magnifier', function(e) {
(!self.disabled && o.click && o.click.apply(this, [e, {
options: self.options,
current: self.current[0],
currentOffset: self.current[1]
}]));
});
2008-09-19 14:20:14 +00:00
2008-07-15 01:54:41 +00:00
// the element must have relative or absolute positioning
2008-07-15 01:32:24 +00:00
if (!(/^(r|a)/).test(this.element.css("position"))) {
this.element.css("position", "relative");
}
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
this.items = [];
this.element.find(o.items).each(function() {
var $this = $(this);
// TODO: use a hash so references to this data is readable
self.items.push([
this,
2008-07-15 01:32:24 +00:00
$this.offset(),
[$this.width(),$this.height()],
(o.overlap ? $this.position() : null)
]);
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
(o.opacity && $this.css('opacity', o.opacity.min));
});
2008-09-19 14:20:14 +00:00
2008-07-15 01:54:41 +00:00
// absolutize
(o.overlap && $.each(this.items, function() {
$(this[0]).css({
position: "absolute",
top: this[3].top,
left: this[3].left
});
}));
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
this.identifier = ++counter;
$(document).bind("mousemove.magnifier"+this.identifier, function(e) {
(self.disabled || self._magnify.apply(self, [e]));
});
2008-09-19 14:20:14 +00:00
2008-07-15 01:54:41 +00:00
this.pp = this.element.offset();
},
2008-09-19 14:20:14 +00:00
destroy: function() {
this.reset();
this.element
2008-07-15 01:32:24 +00:00
.removeClass("ui-magnifier ui-magnifier-disabled")
.unbind(".magnifier");
$(document).unbind("mousemove.magnifier"+this.identifier);
},
2008-09-19 14:20:14 +00:00
disable: function() {
this.reset();
2008-07-15 01:32:24 +00:00
$.widget.prototype.disable.apply(this, arguments);
},
2008-09-19 14:20:14 +00:00
reset: function(e) {
2008-07-15 02:00:34 +00:00
var o = this.options;
2008-09-19 14:20:14 +00:00
2008-07-15 02:00:34 +00:00
$.each(this.items, function() {
var item = this;
$(item[0]).css({
width: item[2][0],
height: item[2][1],
top: (item[3] ? item[3].top : 0),
left: (item[3] ? item[3].left : 0)
});
2008-09-19 14:20:14 +00:00
2008-07-15 02:00:34 +00:00
(o.opacity && $(item[0]).css('opacity', o.opacity.min));
(o.zIndex && $(item[0]).css("z-index", ""));
});
},
2008-09-19 14:20:14 +00:00
_magnify: function(e) {
var p = [e.pageX,e.pageY], o = this.options, c, distance = 1;
this.current = this.items[0];
2008-09-19 14:20:14 +00:00
2008-07-16 00:08:43 +00:00
// Compute the parent's distance
// we don't need to fire anything if we are not near the parent
var overlap = ((p[0] > this.pp.left-o.distance) &&
(p[0] < this.pp.left + this.element[0].offsetWidth + o.distance) &&
(p[1] > this.pp.top-o.distance) &&
(p[1] < this.pp.top + this.element[0].offsetHeight + o.distance));
2008-07-15 01:32:24 +00:00
if (!overlap) { return false; }
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
for (var i=0; i<this.items.length; i++) {
c = this.items[i];
2008-09-19 14:20:14 +00:00
var olddistance = distance;
2008-07-16 00:08:43 +00:00
if (!o.axis) {
distance = Math.sqrt(
Math.pow(p[0] - ((c[3] ? this.pp.left : c[1].left) + parseInt(c[0].style.left,10)) - (c[0].offsetWidth/2), 2)
+ Math.pow(p[1] - ((c[3] ? this.pp.top : c[1].top ) + parseInt(c[0].style.top,10)) - (c[0].offsetHeight/2), 2)
);
} else {
if(o.axis == "y") {
distance = Math.abs(p[1] - ((c[3] ? this.pp.top : c[1].top ) + parseInt(c[0].style.top,10)) - (c[0].offsetHeight/2));
} else {
distance = Math.abs(p[0] - ((c[3] ? this.pp.left : c[1].left) + parseInt(c[0].style.left,10)) - (c[0].offsetWidth/2));
2008-07-16 00:08:43 +00:00
}
}
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
if (distance < o.distance) {
2008-07-16 00:08:43 +00:00
this.current = distance < olddistance ? c : this.current;
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
if (!o.axis || o.axis != "y") {
$(c[0]).css({
width: c[2][0]+ (c[2][0] * (o.magnification-1)) - (((distance/o.distance)*c[2][0]) * (o.magnification-1)),
left: (c[3] ? (c[3].left + o.verticalLine * ((c[2][1] * (o.magnification-1)) - (((distance/o.distance)*c[2][1]) * (o.magnification-1)))) : 0)
});
}
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
if (!o.axis || o.axis != "x") {
$(c[0]).css({
height: c[2][1]+ (c[2][1] * (o.magnification-1)) - (((distance/o.distance)*c[2][1]) * (o.magnification-1)),
top: (c[3] ? c[3].top : 0) + (o.baseline-0.5) * ((c[2][0] * (o.magnification-1)) - (((distance/o.distance)*c[2][0]) * (o.magnification-1)))
2008-07-16 00:08:43 +00:00
});
}
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
if (o.opacity) {
$(c[0]).css('opacity', o.opacity.max-(distance/o.distance) < o.opacity.min ? o.opacity.min : o.opacity.max-(distance/o.distance));
2008-07-15 01:32:24 +00:00
}
} else {
$(c[0]).css({
width: c[2][0],
height: c[2][1],
top: (c[3] ? c[3].top : 0),
left: (c[3] ? c[3].left : 0)
});
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
(o.opacity && $(c[0]).css('opacity', o.opacity.min));
}
2008-09-19 14:20:14 +00:00
2008-07-15 01:32:24 +00:00
(o.zIndex && $(c[0]).css("z-index", ""));
}
2008-09-19 14:20:14 +00:00
2008-07-16 00:08:43 +00:00
(o.zIndex && $(this.current[0]).css("z-index", o.zIndex));
}
});
$.extend($.ui.magnifier, {
defaults: {
distance: 150,
magnification: 2,
baseline: 0,
verticalLine: -0.5,
items: "> *"
2008-07-15 01:32:24 +00:00
}
});
})(jQuery);