While working in my last CakePHP project i needed a piece of javascript code that should help me in positioning a absolute pop up element near mouse click. I had been using prototype library for javascript stuff so i looked around for something real quick and useful to position element (Some useful Position methods with its Object has already been deprecated in new prototype library), and, what i came up with was tooltip.js, a small plugin for prototype library to show tooltips on mouse over and hide them on mouse out event. This was a simple EventObserver class which handled tooltips quite well. However, i looked for a straight way to position element utilizing prototype.
Finally what i came up with was a strange mix of tooltip.js and core javascript code which i am just putting here for my own reference. I am sorry for perfectionists there!
function getWindowWidth() {
var innerWidth;
if (navigator.appVersion.indexOf('MSIE')>0) {
innerWidth = document.body.clientWidth;
} else {
innerWidth = window.innerWidth;
}
return innerWidth;
}
function getWindowHeight(){
var innerHeight;
if (navigator.appVersion.indexOf('MSIE')>0) {
innerHeight = document.body.clientHeight;
} else {
innerHeight = window.innerHeight;
}
return innerHeight;
}
function PositionIt(elem, event) {
var options = Object.extend({
margin: "0px",
padding: "5px",
backgroundColor: "#d6d6fc",
delta_x: 5,
delta_y: 0,
zindex: 1000
});
var dimensions = Element.getDimensions(elem);
var element_width = dimensions.width;
var element_height = dimensions.height;
Event.stop(event);
var mouse_x = Event.pointerX(event);
var mouse_y = Event.pointerY(event);
if ( (element_width + mouse_x) >= ( getWindowWidth() - options.delta_x) ){
mouse_x = mouse_x - element_width;
mouse_x = mouse_x - options.delta_x;
} else {
mouse_x = mouse_x + options.delta_x;
}
if ( (element_height + mouse_y) >= ( getWindowHeight() - options.delta_y) ){
mouse_y = mouse_y - element_height;
mouse_y = mouse_y - options.delta_y;
} else {
mouse_y = mouse_y + options.delta_y;
}
if(mouse_x<0) mouse_x = 0;
if(mouse_y<0) mouse_y = 0;
Element.setStyle(elem, { position:'absolute',
top:mouse_y + "px",
left:mouse_x + "px",
zindex:options.zindex,
display:""
});
Element.show(elem);
}
Although i had been using prototype library i used some shortcut methods like Element.getDimensions(elem), Element.setStyle(), Element.show(elem) and Event.Stop() and i guess these are the only shortcuts which relate to prototype otherwise it is a pure core javascript code to position a pop up element on a browser window.