// b3rtFlyout 1.1
// Copyright 2009, H. poort
// This software may not be used without a valid license

function b3rtFlyout(a,b){this.triggerElementId=a;this.contentElementId=b;this.hideTime=5000;this.animationMultiplier=1.0;this.preferredAlignment={'horizontal':'right','vertical':'center'};this.autoPositioning=true;this.triggerElement=null;this.flyoutElement=null;this.animateElement=null;this.contentElement=null;this.eventHandlers={};this.hideTimer=null;this.animateTimer=null;this.flyoutDimensions={'width':0,'height':0};this.isActive=false;this.isVisible=false;this.isAnimating=false;this.flyoutVisibility={'width':0,'height':0};this.ignoreDeactivation=false};b3rtFlyout.prototype.setHideTime=function(a){this.hideTime=a};b3rtFlyout.prototype.setAnimationMultiplier=function(a){this.animationMultiplier=a};b3rtFlyout.prototype.setPreferredAlignment=function(a,b){if(((typeof a)=='string')&&(a!=''))this.preferredAlignment.horizontal=a;if(((typeof b)=='string')&&(b!=''))this.preferredAlignment.vertical=b};b3rtFlyout.prototype.setAutoPositioning=function(a){if(a)this.autoPositioning=true;else this.autoPositioning=false};b3rtFlyout.prototype.initialize=function(a){if((typeof a)=='undefined')a=0;if(!document.getElementById||!document.createElement)return 0;var b=false;if(!document.body)b=true;if(!b){this.triggerElement=document.getElementById(this.triggerElementId);if(!this.triggerElement)b=true;this.contentElement=document.getElementById(this.contentElementId);if(!this.contentElement)b=true}if(b){if(a>30000)return;var c=this;window.setTimeout(function(){if(c){c.initialize(a+100);c=null}},100);return 1}this.createFlyoutElement();this.setEvents()};b3rtFlyout.prototype.createFlyoutElement=function(){this.flyoutElement=document.createElement('div');document.body.appendChild(this.flyoutElement);this.flyoutElement.style.position='absolute';this.flyoutElement.style.display='none';this.flyoutElement.style.margin='0';this.flyoutElement.style.padding='0';this.flyoutElement.className='b3rtFlyout';this.animateElement=document.createElement('div');this.flyoutElement.appendChild(this.animateElement);this.animateElement.style.position='relative';this.animateElement.style.left='0';this.animateElement.style.top='0';this.animateElement.style.overflow='hidden';this.animateElement.appendChild(this.contentElement);this.contentElement.style.display='block';this.contentElement.style.visibility='visible';this.contentElement.style.position='relative';this.contentElement.style.top='0';this.contentElement.style.left='0';this.flyoutElement.style.visibility='hidden';this.flyoutElement.style.display='block';this.flyoutDimensions.width=this.flyoutElement.offsetWidth;this.flyoutDimensions.height=this.flyoutElement.offsetHeight;this.flyoutElement.style.visibility='';this.flyoutElement.style.display='none'};b3rtFlyout.prototype.calculateFlyoutPosition=function(){var a=this.geWindowInnerDimensions(window);var b=this.getScrollOffsets(window);var c=this.getElementPosition(this.triggerElement);var d={'width':this.triggerElement.offsetWidth,'height':this.triggerElement.offsetHeight};var e={'left':'','top':'','right':'','bottom':''};var f=c.x-b.left;var g=(a.width+b.left)-(c.x+d.width);var h=c.y-b.top;var i=(a.height+b.top)-(c.y+d.height);if(this.preferredAlignment.horizontal=='left'){e.right=a.width-c.x;if(this.autoPositioning&&(f<this.flyoutDimensions.width))e.right+=f-this.flyoutDimensions.width;e.right+='px'}else if(this.preferredAlignment.horizontal=='center'){e.left=c.x+parseInt(d.width/2)-parseInt(this.flyoutDimensions.width/2);if(this.autoPositioning){if(f<parseInt(this.flyoutDimensions.width/2))e.left-=f-parseInt(this.flyoutDimensions.width/2);if(g<parseInt(this.flyoutDimensions.width/2))e.left+=g-parseInt(this.flyoutDimensions.width/2)}e.left+='px'}else{e.left=c.x+d.width;if(this.autoPositioning&&(g<this.flyoutDimensions.width))e.left+=g-this.flyoutDimensions.width;e.left+='px'}if(this.preferredAlignment.vertical=='top'){e.bottom=a.height-c.y;if(this.autoPositioning&&(h<this.flyoutDimensions.height))e.bottom+=h-this.flyoutDimensions.height;e.bottom+='px'}else if(this.preferredAlignment.vertical=='bottom'){e.top=c.y+d.height;if(this.autoPositioning&&(i<this.flyoutDimensions.height))e.top+=i-this.flyoutDimensions.height;e.top+='px'}else{e.top=c.y+parseInt(d.height/2)-parseInt(this.flyoutDimensions.height/2);if(this.autoPositioning){if(h<parseInt(this.flyoutDimensions.width/2))e.top-=h-parseInt(this.flyoutDimensions.height/2);if(i<parseInt(this.flyoutDimensions.width/2))e.top+=i-parseInt(this.flyoutDimensions.height/2)}e.top+='px'}this.flyoutElement.style.left=e.left;this.flyoutElement.style.top=e.top;this.flyoutElement.style.right=e.right;this.flyoutElement.style.bottom=e.bottom};b3rtFlyout.prototype.setEvents=function(){var b=this;this.eventHandlers['windowOnUnload']=function(a){return b.destroy(a?a:window.event)};this.eventHandlers['flyoutOnMouseOver']=function(a){return b.activateFlyout(a?a:window.event)};this.eventHandlers['flyoutOnMouseOut']=function(a){return b.deactivateFlyout(null,a?a:window.event)};this.eventHandlers['triggerOnMouseOver']=function(a){return b.activateFlyout(a?a:window.event)};this.eventHandlers['triggerOnMouseOut']=function(a){return b.deactivateFlyout(null,a?a:window.event)};this.eventHandlers['flyoutOnClick']=function(a){b.ignoreDeactivation=true};this.eventHandlers['triggerOnClick']=function(a){b.ignoreDeactivation=true};this.eventHandlers['documentOnClick']=function(a){return b.deactivateFlyout(true,a?a:window.event)};this.addEventHandler(window,'unload',this.eventHandlers['windowOnUnload']);this.addEventHandler(this.flyoutElement,'mouseover',this.eventHandlers['flyoutOnMouseOver']);this.addEventHandler(this.flyoutElement,'mouseout',this.eventHandlers['flyoutOnMouseOut']);this.addEventHandler(this.triggerElement,'mouseover',this.eventHandlers['triggerOnMouseOver']);this.addEventHandler(this.triggerElement,'mouseout',this.eventHandlers['triggerOnMouseOut']);this.addEventHandler(this.flyoutElement,'click',this.eventHandlers['flyoutOnClick']);this.addEventHandler(this.triggerElement,'click',this.eventHandlers['triggerOnClick']);this.addEventHandler(window.document,'click',this.eventHandlers['documentOnClick'])};b3rtFlyout.prototype.activateFlyout=function(){this.isActive=true;if((typeof this.hideTimer)=='number'){window.clearTimeout(this.hideTimer);this.hideTimer=null}if(!this.isVisible)this.calculateFlyoutPosition();this.animateFlyout()};b3rtFlyout.prototype.deactivateFlyout=function(a){if(this.ignoreDeactivation){this.ignoreDeactivation=false;return}if(!a&&((typeof this.hideTimer)!='number')){var b=this;this.hideTimer=window.setTimeout(function(){b.deactivateFlyout(true)},this.hideTime);return}if(a){this.isActive=false;this.animateFlyout()}};b3rtFlyout.prototype.animateFlyout=function(){if(!this.isAnimating)this.isAnimating=true;if(this.isActive){if((this.flyoutVisibility.width==0)&&(this.flyoutVisibility.height==0))this.flyoutElement.style.display='block';if(this.flyoutVisibility.width<this.flyoutDimensions.width){var a=parseInt(((this.flyoutDimensions.width-this.flyoutVisibility.width)/10)*this.animationMultiplier);if(a<1)a=1;this.flyoutVisibility.width+=a;if(this.flyoutVisibility.width>this.flyoutDimensions.width)this.flyoutVisibility.width=this.flyoutDimensions.width;this.animateElement.style.width=this.flyoutVisibility.width+'px'}if(this.flyoutVisibility.height<this.flyoutDimensions.height){var a=parseInt(((this.flyoutDimensions.height-this.flyoutVisibility.height)/10)*this.animationMultiplier);if(a<1)a=1;this.flyoutVisibility.height+=a;if(this.flyoutVisibility.height>this.flyoutDimensions.height)this.flyoutVisibility.height=this.flyoutDimensions.height;this.animateElement.style.height=this.flyoutVisibility.height+'px'}}if(!this.isActive){if(this.flyoutVisibility.width!=0){var a=parseInt((this.flyoutVisibility.width/10)*this.animationMultiplier);if(a<1)a=1;this.flyoutVisibility.width-=a;if(this.flyoutVisibility.width<0)this.flyoutVisibility.width=0;this.animateElement.style.width=this.flyoutVisibility.width+'px'}if(this.flyoutVisibility.height!=0){var a=parseInt((this.flyoutVisibility.height/10)*this.animationMultiplier);if(a<1)a=1;this.flyoutVisibility.height-=a;if(this.flyoutVisibility.height<0)this.flyoutVisibility.height=0;this.animateElement.style.height=this.flyoutVisibility.height+'px'}if((this.flyoutVisibility.width==0)&&(this.flyoutVisibility.height==0))this.flyoutElement.style.display='none'}if((this.flyoutVisibility.width!=0)||(this.flyoutVisibility.width!=0))this.isVisible=true;else this.isVisible=false;if(((this.flyoutVisibility.width!=this.flyoutDimensions.width)&&(this.flyoutVisibility.width!=0))||((this.flyoutVisibility.height!=this.flyoutDimensions.height)&&(this.flyoutVisibility.height!=0))){var b=this;this.animateTimer=window.setTimeout(function(){b.animateFlyout();b=null},15)}else{if(this.isAnimating)this.isAnimating=false}};b3rtFlyout.prototype.destroy=function(){if(this.eventHandlers['windowOnUnload'])this.removeEventHandler(window,'unload',this.eventHandlers['windowOnUnload']);if(this.flyoutElement){if(this.eventHandlers['flyoutOnMouseOver']){this.removeEventHandler(this.flyoutElement,'mouseover',this.eventHandlers['flyoutOnMouseOver']);this.removeEventHandler(this.flyoutElement,'mouseout',this.eventHandlers['flyoutOnMouseOut']);this.removeEventHandler(this.triggerElement,'mouseover',this.eventHandlers['triggerOnMouseOver']);this.removeEventHandler(this.triggerElement,'mouseout',this.eventHandlers['triggerOnMouseOut']);this.removeEventHandler(this.flyoutElement,'click',this.eventHandlers['flyoutOnClick']);this.removeEventHandler(this.triggerElement,'click',this.eventHandlers['triggerOnClick']);this.removeEventHandler(window.document,'click',this.eventHandlers['documentOnClick'])}document.body.removeChild(this.flyoutElement);this.flyoutElement=null}for(var i in this.eventHandlers)this.eventHandlers[i]=null};b3rtFlyout.prototype.addEventHandler=function(a,b,c,d){var e=((typeof d)=='undefined'?false:d);if(a.addEventListener)a.addEventListener(b,c,e);else if(a.attachEvent)a.attachEvent('on'+b,c);else a['on'+b]=c};b3rtFlyout.prototype.removeEventHandler=function(a,b,c,d){var e=((typeof d)=='undefined'?false:d);if(a.removeEventListener)a.removeEventListener(b,c,e);else if(a.detachEvent)a.detachEvent('on'+b,c);else a['on'+b]=null};b3rtFlyout.prototype.getElementPosition=function(a){var b={'x':0,'y':0};if(!a.offsetParent||((typeof a.offsetLeft)!='number'))return b;while(a.offsetParent){b.x+=a.offsetLeft;b.y+=a.offsetTop;a=a.offsetParent}if(a.offsetLeft)b.x+=a.offsetLeft;if(a.offsetTop)b.y+=a.offsetTop;return b};b3rtFlyout.prototype.geWindowInnerDimensions=function(a){var b={'width':0,'height':0};if(a.innerHeight){b.width=a.document.documentElement.clientWidth;b.height=a.document.documentElement.clientHeight}else if(a.document.documentElement&&a.document.documentElement.clientHeight){b.width=a.document.documentElement.clientWidth;b.height=a.document.documentElement.clientHeight}else if(a.document.body){b.width=a.document.body.clientWidth;b.height=a.document.body.clientHeight}return b};b3rtFlyout.prototype.getScrollOffsets=function(a){var b={'left':0,'top':0};b.left=a.pageXOffset;if((typeof b.left)=='undefined')b.left=a.document.body.scrollLeft;if(((typeof b.left)=='number')&&(b.left==0))b.left=a.document.documentElement.scrollLeft;b.top=a.pageYOffset;if((typeof b.top)=='undefined')b.top=a.document.body.scrollTop;if(((typeof b.top)=='number')&&(b.top==0))b.top=a.document.documentElement.scrollTop;return b};