1 |
12865
|
katerina.i
|
/* Smart Hover Box for Mootools 1.2
|
2 |
|
|
* v1.0
|
3 |
|
|
* Dedicated to public domain
|
4 |
|
|
* troy@consideropen.com
|
5 |
|
|
* www.consideropen.com/blog
|
6 |
|
|
*/
|
7 |
|
|
|
8 |
|
|
/* Usage:
|
9 |
|
|
* to implement smart hover box,
|
10 |
|
|
* take the id of the element you want to hover over,
|
11 |
|
|
* then use the id + the "smartBoxSuffix" as the id for the hover element.
|
12 |
|
|
* Finally, create a new SmartHoverBox class and set any options you want to change.
|
13 |
|
|
*/
|
14 |
|
|
|
15 |
|
|
var SmartHoverBox = new Class({
|
16 |
|
|
Implements: Options,
|
17 |
|
|
options: {
|
18 |
|
|
boxTimer : 1000, // how many milliseconds before the box hides after mouseleave
|
19 |
|
|
yOffset : -10, // up and down offset in px - accepts negative ints
|
20 |
|
|
xOffset : -10, // left and right offset in px - accepts negative ints
|
21 |
|
|
smartBoxSuffix : '_smarthbox', //suffix that creates a hover box
|
22 |
|
|
smartBoxClose : 'smarthbox_close', //this class will add "close" click event to element
|
23 |
|
|
lockY : '', // 'top', 'bottom'
|
24 |
|
|
lockX : '' // 'left', 'right'
|
25 |
|
|
},
|
26 |
|
|
initialize: function(options) {
|
27 |
|
|
this.setOptions(options);
|
28 |
|
|
this.pos = [];
|
29 |
|
|
this.smartBoxes = $$('[id$=' + this.options.smartBoxSuffix + ']');
|
30 |
|
|
this.closeElem = $(document.body).getElements('.' + this.options.smartBoxClose);
|
31 |
|
|
this.closeElem.addEvent('click', function(e){
|
32 |
|
|
e.preventDefault();
|
33 |
|
|
this.closeBox();
|
34 |
|
|
}.bind(this)).setStyle('cursor', 'pointer');
|
35 |
|
|
this.smartBoxes.setStyle('display', 'none');
|
36 |
|
|
this.showHideBox();
|
37 |
|
|
this.closeBox();
|
38 |
|
|
},
|
39 |
|
|
showHideBox: function(){
|
40 |
|
|
this.smartBoxes.each(function(item){
|
41 |
|
|
this.getCurrentBox(item);
|
42 |
|
|
item.addEvent('mouseleave', function(){this.closeBoxTimer()}.bind(this));
|
43 |
|
|
item.addEvent('mouseenter', function(){$clear(this.delay)}.bind(this));
|
44 |
|
|
$(this.currentBox).addEvent('mouseleave', function(){this.closeBoxTimer()}.bind(this));
|
45 |
|
|
$(this.currentBox).addEvent('mouseenter', function(){
|
46 |
|
|
this.getCurrentBox(item);
|
47 |
|
|
$clear(this.delay);
|
48 |
|
|
this.smartBoxes.setStyle('display', 'none');
|
49 |
|
|
item.setStyles({ display: 'block', position: 'absolute' }).setStyle('z-index', '1000000');
|
50 |
|
|
|
51 |
|
|
this.positioning(item, this.currentBox);
|
52 |
|
|
|
53 |
|
|
}.bind(this)).setStyle('cursor', 'pointer');
|
54 |
|
|
}.bind(this));
|
55 |
|
|
},
|
56 |
|
|
closeBoxTimer: function(){
|
57 |
|
|
this.hideEm = function(){this.closeBox()}.bind(this);
|
58 |
|
|
this.delay = this.hideEm.delay(this.options.boxTimer);
|
59 |
|
|
},
|
60 |
|
|
closeBox: function() {
|
61 |
|
|
this.smartBoxes.setStyle('display', 'none');
|
62 |
|
|
},
|
63 |
|
|
positioning: function(currentItem, currentLink){
|
64 |
|
|
this.pos.windowSize = $(window).getSize();
|
65 |
|
|
this.pos.windowScroll = $(window).getScroll();
|
66 |
|
|
this.pos.boxSize = currentItem.getSize();
|
67 |
|
|
this.pos.inputPOS = $(currentLink).getCoordinates();
|
68 |
|
|
this.pos.inputCOOR = $(currentLink).getPosition();
|
69 |
|
|
this.pos.inputSize = $(currentLink).getSize();
|
70 |
|
|
this.pos.halfWindowY = this.pos.windowSize.y / 2;
|
71 |
|
|
this.pos.halfWindowX = this.pos.windowSize.x / 2;
|
72 |
|
|
this.pos.inputBottomPOS = this.pos.inputPOS.top + this.pos.inputSize.y;
|
73 |
|
|
this.pos.inputBottomPOSAdjust = this.pos.inputBottomPOS - this.pos.windowScroll.y
|
74 |
|
|
this.pos.inputLeftPOS = this.pos.inputPOS.left + this.options.xOffset;
|
75 |
|
|
this.pos.inputRightPOS = this.pos.inputPOS.right;
|
76 |
|
|
this.pos.leftOffset = this.pos.inputCOOR.x + this.options.xOffset;
|
77 |
|
|
|
78 |
|
|
if(this.pos.halfWindowY < this.pos.inputBottomPOSAdjust && this.options.lockY == 'none' || this.options.lockY == 'top') {
|
79 |
|
|
currentItem.setStyle('top', this.pos.inputPOS.top - this.pos.boxSize.y - this.options.yOffset); //top
|
80 |
|
|
if (this.pos.inputLeftPOS < this.pos.halfWindowX && this.options.lockX == 'none' || this.options.lockX == 'left' ) {
|
81 |
|
|
currentItem.setStyle('left', this.pos.leftOffset); //top left
|
82 |
|
|
}
|
83 |
|
|
else { currentItem.setStyle('left', (this.pos.inputPOS.right - this.pos.boxSize.x) - this.options.xOffset); }; //top right
|
84 |
|
|
}
|
85 |
|
|
else {
|
86 |
|
|
currentItem.setStyle('top', this.pos.inputBottomPOS + this.options.yOffset); //bottom
|
87 |
|
|
if (this.pos.inputLeftPOS < this.pos.halfWindowX && this.options.lockX == 'none' || this.options.lockX == 'left' ) {
|
88 |
|
|
currentItem.setStyle('left', this.pos.leftOffset); //bottom left
|
89 |
|
|
}
|
90 |
|
|
else { currentItem.setStyle('left', (this.pos.inputPOS.right - this.pos.boxSize.x) - this.options.xOffset);};//bottom right
|
91 |
|
|
};
|
92 |
|
|
},
|
93 |
|
|
getCurrentBox: function(currentItem){
|
94 |
|
|
this.currentBox = currentItem.getProperty('id');
|
95 |
|
|
this.currentBox = this.currentBox.replace('' + this.options.smartBoxSuffix + '', '');
|
96 |
|
|
}
|
97 |
|
|
});
|