/*
* @Class: ElementUtility
*
* @Description: Utility for inspecting properties and removing classes
*
* @Usage: new ElementUtility( Obj )
* @Methods: withinViewport(), removeClasses( Array )
*
*/
var ElementUtility = (!detectBrowser.modernBrowser())?function(){}:Class.create();
ElementUtility.prototype = (!detectBrowser.modernBrowser())?{}:{
initialize: function(element)
{
this.setElement(element);
},
setElement: function(element)
{
this.el = element;
},
getElement: function()
{
return this.el;
},
withinViewport: function(element)
{
// is element within
if(element != null)
{
this.setElement(element);
}
var elOffset = this.el.cumulativeOffset();
var vpOffset = document.viewport.getScrollOffsets();
var elDim = this.el.getDimensions();
var vpDim = document.viewport.getDimensions();
if ( (elOffset[1] + elDim.height) > vpOffset[1] + vpDim.height || (elOffset[0] + elDim.width) > vpOffset[0] + vpDim.width - 25 )
{
return false;
}
else
{
return true;
}
},
cumulativeOffsetBorders: function(element) {
var valueT = 0, valueL = 0;
do
{
valueT += element.offsetTop || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
if(element)
{
valueT += parseInt(Element.getStyle(element, 'borderTopWidth')) || 0;
valueL += parseInt(Element.getStyle(element, 'borderLeftWidth')) || 0;
}
}
while (element);
if (Prototype.Browser.IE)
{
// why does IE add 2px borders??
valueT = valueT - 2;
valueL = valueL - 2;
}
_returnOffset = function(l, t)
{
var result = [l, t];
result.left = l;
result.top = t;
return result;
};
return _returnOffset(valueL, valueT);
}
};
/*
* @Class: FloatingInfo
* @Extends: ElementUtility
*
* @Description: abstracted overlay class
*
*/
var FloatingInfo = (!detectBrowser.modernBrowser())?function(){}:Class.create();
FloatingInfo.prototype = (!detectBrowser.modernBrowser())?{}:Object.extend( new ElementUtility(), {
initialize: function(element, parameters)
{
// set element
this.setElement(element);
// set parameters
this.content = parameters.contentRender;
this.positionObj = parameters.positionObject;
this.floatByType = 'element';
this.floatDirection = parameters.floatDirection;
this.widthClass = parameters.widthClass;
if( typeof(parameters.padding) == "number" )
{
this.arrowPadding = parameters.padding;
}
else
{
this.arrowPadding = 0;
}
this.setOverlayClasses(parameters.overlayClasses);
this.setArrowClass(parameters.arrowClass);
if (typeof(parameters.timeOut) == "number")
{
this.timeOut = parameters.timeOut;
}else{
this.timeOut = 600;
}
// fetch existing overlay elements
this.arrow = $('floatArrow');
this.floatMessage = $('floatMessage');
if(Prototype.Browser.IE)
{
this.floatMessageIFrame = $('floatMessageIFrame');
this.floatMessageIFrame2 = $('floatMessageIFrame2');
}
this.floatMessageInner = $('floatMessageInner');
this.floatMessageTop = $('floatMessageTop');
this.floatMessageBottom = $('floatMessageBottom');
// render content
this.fetchOverlay();
this.renderContent();
this.cancellogin = $('cancellogin');
this.closelink = $('closelink');
//this.mynasa = $('mynasah5');
// create and set location of float
if(this.floatDirection == 'auto'){
this.floatRight();
if(ElementUtility.prototype.withinViewport(this.floatMessage)==false){
this.floatLeft();
}
if(ElementUtility.prototype.withinViewport(this.floatMessage)==false){
this.floatUp();
}
if(ElementUtility.prototype.withinViewport(this.floatMessage)==false){
this.floatDown();
}
}else{
switch(this.floatDirection){
case 'top':
this.floatUp();
break;
case 'right':
this.floatRight();
break;
case 'bottom':
this.floatDown();
break;
case 'left':
this.floatLeft();
break;
default:
this.floatRight();
break;
}
}
// hide element on window resize
Event.observe(window,'resize',function(){
FloatingInfo.prototype.currentLivingElement = null;
FloatingInfo.prototype.hideOverlay();
});
// track element life
this.saveLifeFunction();
// delegate mouseout, mouseover events
this.floatMessage.onmouseover = this.saveLifeFunction.bind(this);
this.arrow.onmouseover = this.saveLifeFunction.bind(this);
this.floatMessage.onmouseout = this.endLifeFunction.bind(this);
this.arrow.onmouseout = this.endLifeFunction.bind(this);
//if($('mynasah5')){
// this.mynasa.onmousedown = this.saveLifeFunction.bind(this);
// this.arrow.onmousedown = this.saveLifeFunction.bind(this);
//}
/*if($('cancellogin')){
this.cancellogin.onmousedown = this.endLifeFunction.bind(this);
}
if($('closelink')){
this.closelink.onmousedown = this.endLifeFunction.bind(this);
}*/
// start observing on our element for a mouseout
if(!this.el.hasClassName('observe_click')){
Event.observe(this.el, 'mouseout', this.floatHandler.bind(this));
}
else{
if($('cancellogin')){
Event.observe($('cancellogin'), 'click', function(event) {
//Event.observe(this.el, 'mousedown', this.mouseDownHandler.bind(this));
event.preventDefault();
FloatingInfo.prototype.hideOverlay();
});
}
if($('closelink')){
Event.observe($('closelink'), 'click', function(event) {
// Event.observe(this.el, 'mousedown', this.mouseDownHandler.bind(this));
event.preventDefault();
FloatingInfo.prototype.hideOverlay();
});
}
}
if(!this.el.hasClassName('observe_click')){
Event.observe(this.el, 'blur', this.focusHandler.bind(this));
}
// auto focusing removed due to incompatibilities with keyboard accessibility code
// this.floatMessageInner.focus();
},
setOverlayClasses: function(classes)
{
if( typeof(classes) == "object" )
{
this.topOverlayClass = classes.top;
this.innerOverlayClass = classes.inner;
this.bottomOverlayClass = classes.bottom;
}
},
setArrowClass: function(myClass)
{
this.arrowClass = myClass;
},
applyClasses: function(direction)
{
this.floatMessage.className = "normal_overlay_float";
if(this.widthClass && this.widthClass != 'null'){
this.floatMessage.className = this.widthClass + '_float';
}
if(Prototype.Browser.IE)
{
var arrowchild = document.getElementById( 'floatArrow');
if(arrowchild != null)
{
document.body.removeChild(arrowchild);
this.arrow = new Element("div",{'id':'floatArrow'});
document.body.appendChild(this.arrow);
}
}
// first remove all classes
this.floatMessageTop.className = '';
this.floatMessageInner.className = '';
this.floatMessageBottom.className = '';
this.arrow.className = '';
//apply classes
this.floatMessageTop.addClassName(this.topOverlayClass);
this.floatMessageInner.addClassName(this.innerOverlayClass);
this.floatMessageBottom.addClassName(this.bottomOverlayClass );
this.arrow.addClassName(this.arrowClass + '_' + direction);
},
fetchOverlay: function()
{
if(!this.floatMessage)
{
this.arrow = new Element("div",{'id':'floatArrow'});
this.floatMessageTop = new Element("div",{'id':'floatMessageTop'});
this.floatMessageBottom = new Element("div",{'id':'floatMessageBottom'});
this.floatMessageInner = new Element("div",{'id':'floatMessageInner'});
this.floatMessage = new Element("div",{'id':'floatMessage'});
if(Prototype.Browser.IE)
{
this.floatMessageIFrame = new Element("iframe",{
'id':'floatMessageIFrame',
'src':'javascr'+'ipt:\'\''
// 'src':'/blank.html'
});
this.floatMessageIFrame.frameBorder=0;
// this.floatMessageIFrame.allowTransparency="yes";
// this.floatMessageIFrame.style.cssText = 'background:transparent';
this.floatMessageIFrame.setStyle({
'backgroundColor':'#000000',
'zIndex':9997,
'position':'absolute'
});
this.floatMessageIFrame2 = new Element("iframe",{
'id':'floatMessageIFrame2',
'src':'javascr'+'ipt:\'\''
// 'src':'/blank.html'
});
this.floatMessageIFrame2.frameBorder=0;
// this.floatMessageIFrame.allowTransparency="yes";
// this.floatMessageIFrame.style.cssText = 'background:transparent';
this.floatMessageIFrame2.setStyle({
'backgroundColor':'#000000',
'zIndex':9997,
'position':'absolute'
});
}
this.floatMessage.appendChild(this.floatMessageTop);
this.floatMessage.appendChild(this.floatMessageInner);
this.floatMessage.appendChild(this.floatMessageBottom);
document.body.appendChild(this.floatMessage);
if(Prototype.Browser.IE)
{
document.body.appendChild(this.floatMessageIFrame);
document.body.appendChild(this.floatMessageIFrame2);
}
document.body.appendChild(this.arrow);
}
},
hideOverlay: function()
{
_quickHide = function()
{
if(Prototype.Browser.IE)
{
var i1 = $('floatMessageIframe');
var i2 = $('floatMessageIframe2');
if(i1){
i1.hide();
}
if($('floatMessageIframe2')){
i2.hide();
}
}
var fm = $('floatMessage');
var fa = $('floatArrow');
if(fm){
fm.hide();
}
if(fa){
fa.hide();
}
};
_quickHide();
/*
if(Prototype.Browser.IE)
{
_quickHide();
}
else
{
Effect.Fade('floatArrow',{ duration:0.2 });
Effect.Fade('floatMessage',{ duration:0.2, afterFinish:_quickHide });
}
*/
},
renderContent: function()
{
if( typeof(this.content) == "function" )
{
this.content(this.floatMessageInner);
}
else if(typeof(this.content) == "string")
{
this.floatMessageInner.update(this.content);
}
},
overlayPosition: function()
{
// float absolutely
if( this.positionObj && this.positionObj.x != null && this.positionObj.y != null && typeof(Number(this.positionObj.x)) == "number" && typeof(Number(this.positionObj.y)) == "number" )
{
var posY = this.positionObj.y;
var posx = this.positionObj.x;
this.floatByType = 'absolute';
}
// float by mouse
else if( this.positionObj && this.positionObj.event != null )
{
Event.observe(document, this.positionObj.event, function(){
return function (event) {
var posY = Event.pointerY(event);
var posX = Event.pointerX(event);
};
}, false);
this.floatByType = 'mouse';
}
// float by element
else
{
var posArr = ElementUtility.prototype.cumulativeOffsetBorders(this.el);
var posY = posArr[1];
var posX = posArr[0];
this.floatByType = 'element';
}
var position = {"x": posX, "y": posY};
return position;
},
getDimensions: function(){
// get dimensions by style properties to offset issues with getHeight() and getWidth
var valueElementH = parseInt(Element.getStyle(this.el, 'height')) || 0;
var valueElementW = parseInt(Element.getStyle(this.el, 'width')) || 0;
var valueArrowH = parseInt(Element.getStyle(this.arrow, 'height')) || 0;
var valueArrowW = parseInt(Element.getStyle(this.arrow, 'width')) || 0;
var valueFloatH = parseInt(Element.getStyle(this.floatMessage, 'height')) || 0;
var valueFloatW = parseInt(Element.getStyle(this.floatMessage, 'width')) || 0;
var dimensions = {
"element": { "h":valueElementH, "w":valueElementW },
"arrow": { "h":valueArrowH, "w":valueArrowW },
"floatMessage": { "h":valueFloatH, "w":valueFloatW }
};
return dimensions;
},
saveLifeFunction: function()
{
FloatingInfo.prototype.currentLivingElement = this.el;
},
endLifeFunction: function()
{
FloatingInfo.prototype.currentLivingElement = null;
},
focusHandler: function(privateElement){
Event.stopObserving(this.el, "blur", this.focusHandler);
this.hideOverlay();
},
mouseDownHandler: function(privateElement){
Event.stopObserving(this.el, "mousedown", this.mouseDownHandler);
this.hideOverlay();
},
floatHandler: function(privateElement)
{
// instantiate safariHover class to handle inner elements
new safariHover('out',this.el, privateElement, function()
{
// ignore child elements in this handler
if(privateElement.target==this.el || privateElement.target==this.el.firstChild)
{
FloatingInfo.prototype.previousLivingElement = this.el;
this.endLifeFunction();
// create timers hash if we don't yet have one.
if( typeof(FloatingInfo.prototype.timers)=='undefined' )
{
FloatingInfo.prototype.timers = {};
}
// clean up previous timer for a given element
if(FloatingInfo.prototype.timers[this.el])
{
clearInterval(FloatingInfo.prototype.timers[this.el]);
}
// create a new interval timer for a given element
FloatingInfo.prototype.timers[this.el] = setInterval(function()
{
if(!$('floatMessage')) {
// if the float message is gone, shut the timer down.
clearInterval(FloatingInfo.prototype.timers[this.el]);
}
else
{
if(FloatingInfo.prototype.currentLivingElement == null)
{
if($('floatMessage'))
{
this.hideOverlay();
}
clearInterval(FloatingInfo.prototype.timers[this.el]);
Event.stopObserving(this.el, "mouseout", this.floatHandler);
}
else
{
// life was saved
}
}
}.bind(this),this.timeOut);
Event.stop(privateElement);
}
}.bind(this));
},
floatRight: function()
{
// get x,y co-ordinates
var position = this.overlayPosition();
// set classes
this.applyClasses('left');
// get dimensions of all elements
var dimensions = this.getDimensions();
if(this.floatByType == 'element')
{
var floatY = position.y - ( ( this.floatMessage.getHeight() - dimensions.element.h ) / 2);
var floatX = position.x + this.arrowPadding + this.arrow.getWidth() + dimensions.element.w;
var arrowY = position.y - (( this.arrow.getHeight() - dimensions.element.h ) / 2);
var arrowX = position.x + this.arrowPadding + dimensions.element.w;
}
else
{
var floatY = position.y - ( this.floatMessage.getHeight() / 2 );
var floatX = position.x - this.arrowPadding - dimensions.arrow.w;
var arrowY = position.y - ( dimensions.arrow.h / 2 );
var arrowX = position.x - this.arrowPadding;
}
this.arrow.setStyle({
top: arrowY + 'px',
left: arrowX + 'px',
opacity: 1.0
});
this.floatMessage.setStyle({
top: floatY + 'px',
left: floatX + 'px',
opacity: 1.0,
visibility: 'visible'
});
if(Prototype.Browser.IE)
{
this.floatMessageIFrame.setStyle({
top:(parseInt(this.floatMessage.getStyle('top'))+3)+'px',
left:this.floatMessage.getStyle('left'),
width:(this.floatMessage.getWidth()-2)+'px',
height:(this.floatMessage.getHeight()-6)+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame').show();
this.floatMessageIFrame2.setStyle({
top:this.floatMessage.getStyle('top'),
left:(parseInt(this.floatMessage.getStyle('left'))+3)+'px',
width:(this.floatMessage.getWidth()-6)+'px',
height:this.floatMessage.getHeight()+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame2').show();
}
$('floatMessage').show();
$('floatArrow').show();
},
floatLeft: function()
{
// get x,y co-ordinates
var position = this.overlayPosition();
// set classes
this.applyClasses('right');
// get dimensions of all elements
var dimensions = this.getDimensions();
if(this.floatByType == 'element')
{
var floatY = position.y - ( ( this.floatMessage.getHeight() - dimensions.element.h ) / 2);
var floatX = position.x - this.arrowPadding - this.arrow.getWidth() - this.floatMessage.getWidth();
var arrowY = position.y - (( this.arrow.getHeight() - dimensions.element.h ) / 2);
var arrowX = position.x - this.arrowPadding - this.arrow.getWidth();
}
else
{
var floatY = position.y - ( this.floatMessage.getHeight() / 2 );
var floatX = position.x - this.arrowPadding - dimensions.arrow.w;
var arrowY = position.y - ( dimensions.arrow.h / 2 );
var arrowX = position.x - this.arrowPadding;
}
this.arrow.setStyle({
top: arrowY + 'px',
left: arrowX + 'px',
opacity: 1.0
});
this.floatMessage.setStyle({
top: floatY + 'px',
left: floatX + 'px',
opacity: 1.0,
visibility: 'visible'
});
if(Prototype.Browser.IE)
{
this.floatMessageIFrame.setStyle({
top:(parseInt(this.floatMessage.getStyle('top'))+3)+'px',
left:this.floatMessage.getStyle('left'),
width:(this.floatMessage.getWidth()-2)+'px',
height:(this.floatMessage.getHeight()-6)+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame').show();
this.floatMessageIFrame2.setStyle({
top:this.floatMessage.getStyle('top'),
left:(parseInt(this.floatMessage.getStyle('left'))+3)+'px',
width:(this.floatMessage.getWidth()-6)+'px',
height:this.floatMessage.getHeight()+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame2').show();
}
$('floatMessage').show();
$('floatArrow').show();
},
floatUp: function()
{
// get x,y co-ordinates
var position = this.overlayPosition();
// set classes
this.applyClasses('down');
// get dimensions of all elements
var dimensions = this.getDimensions();
if(this.floatByType == 'element')
{
var floatY = position.y - this.arrowPadding - this.floatMessage.getHeight() - dimensions.arrow.h;
var floatX = position.x - (( this.floatMessage.getWidth() - this.el.getWidth() ) / 2);
var arrowY = position.y - this.arrowPadding - dimensions.arrow.h;
var arrowX = position.x - ( ( this.arrow.getWidth() / 2 ) - ( this.el.getWidth() / 2 ) );
}
else
{
var floatY = position.y + this.arrowPadding + this.floatMessage.getHeight();
var floatX = position.x - ( this.floatMessage.getWidth() / 2 );
var arrowY = position.y + this.arrowPadding;
var arrowX = position.x - ( dimensions.arrow.w / 2 );
}
this.arrow.setStyle({
top: arrowY + 'px',
left: arrowX + 'px',
opacity: 1.0
});
this.floatMessage.setStyle({
top: floatY + 'px',
left: floatX + 'px',
opacity: 1.0,
visibility: 'visible'
});
if(Prototype.Browser.IE)
{
this.floatMessageIFrame.setStyle({
top:(parseInt(this.floatMessage.getStyle('top'))+3)+'px',
left:this.floatMessage.getStyle('left'),
width:(this.floatMessage.getWidth()-2)+'px',
height:(this.floatMessage.getHeight()-6)+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame').show();
this.floatMessageIFrame2.setStyle({
top:this.floatMessage.getStyle('top'),
left:(parseInt(this.floatMessage.getStyle('left'))+3)+'px',
width:(this.floatMessage.getWidth()-6)+'px',
height:this.floatMessage.getHeight()+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame2').show();
}
$('floatMessage').show();
$('floatArrow').show();
},
floatDown: function()
{
// get x,y co-ordinates
var position = this.overlayPosition();
// set classes
this.applyClasses('up');
// get dimensions of all elements
var dimensions = this.getDimensions();
if(this.floatByType == 'element')
{
var floatY = position.y + this.arrowPadding + this.arrow.getHeight() + this.el.getHeight();
var floatX = position.x - (( this.floatMessage.getWidth() - this.el.getWidth() ) / 2);
var arrowY = position.y + this.arrowPadding + this.el.getHeight();
var arrowX = position.x - ( ( this.arrow.getWidth() / 2 ) - ( this.el.getWidth() / 2 ) );
}
else
{
var floatY = position.y + this.arrowPadding + dimensions.arrow.h;
var floatX = position.x - ( this.floatMessage.getWidth() / 2 );
var arrowY = position.y + this.arrowPadding;
var arrowX = position.x - ( dimensions.arrow.w / 2 );
}
this.arrow.setStyle({
top: arrowY + 'px',
left: arrowX + 'px',
opacity: 1.0
});
this.floatMessage.setStyle({
top: floatY + 'px',
left: floatX + 'px',
opacity: 1.0,
visibility: 'visible'
});
if(Prototype.Browser.IE)
{
this.floatMessageIFrame.setStyle({
top:(parseInt(this.floatMessage.getStyle('top'))+3)+'px',
left:this.floatMessage.getStyle('left'),
width:(this.floatMessage.getWidth()-2)+'px',
height:(this.floatMessage.getHeight()-6)+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame').show();
this.floatMessageIFrame2.setStyle({
top:this.floatMessage.getStyle('top'),
left:(parseInt(this.floatMessage.getStyle('left'))+3)+'px',
width:(this.floatMessage.getWidth()-6)+'px',
height:this.floatMessage.getHeight()+'px',
opacity:1.0,
visibility:'visible'
});
$('floatMessageIFrame2').show();
}
$('floatMessage').show();
$('floatArrow').show();
}
});
// end class
/*
* @Class: safariHover
*
* @Description: class to handle safari 2 issue with inner element
*
*/
var safariHover = (!detectBrowser.modernBrowser())?function(){}:Class.create();
safariHover.prototype = (!detectBrowser.modernBrowser())?{}:{
initialize: function(hoverState, hoverElement, hoverEvent, callBack)
{
this.callBack = callBack;
if(Prototype.Browser.WebKit && hoverElement.tagName.toLowerCase() != 'td' && detectBrowser.whichVersion() == '2')
{
if(hoverState == 'over')
{
var IsItIn = Position.within(hoverElement, Event.pointerX(hoverEvent), Event.pointerY(hoverEvent));
if(IsItIn && !hoverElement.ItIsIn)
{
hoverElement.ItIsIn = true;
if(typeof(this.callBack)=='function')
{
this.callBack();
}
}
}
if(hoverState == 'out')
{
var IsItIn = Position.within(hoverElement, Event.pointerX(hoverEvent), Event.pointerY(hoverEvent));
if(!IsItIn && hoverElement.ItIsIn)
{
hoverElement.ItIsIn = false;
if(typeof(this.callBack)=='function')
{
this.callBack();
}
}
}
} else {
if(typeof(this.callBack)=='function')
{
this.callBack();
}
}
}
};